テキストの表示・編集処理を行うコマンド
CUIの操作が基本であるLinuxサーバではコマンドライン上でテキスト表示・編集ができると便利です。
ログなどから見たい部分だけを表示できるようになると操作が捗ります。
コマンドでのテキスト表示・編集スキルはLinux操作の基本となるためコマンドの種類や操作方法を覚えておきましょう。
テキストの表示
テキストを表示する標準的なコマンドには以下のものがあります。
- echo
- cat
- less
- more
tailコマンド ファイルの末尾を表示!ログの監視に!
tailはファイルの末尾を表示するコマンドです(デフォルトは末尾から10行目まで)。
最新情報はファイルの末尾に書いてあるのでtailは最新情報を見たい時に便利です。
例えばログファイルの最新情報を見たい時にtailは使えます。
tail -f
を使用するとそのファイルをリアルタイムに開き続けることができるため、リアルタイムに書き出されたログを確認することができて便利です。
コマンド実行時にそれが実際に反映されたか?というのを調べることもできます。
less +F
があります。lessなので前の情報を参照できるので便利です。
headコマンド ファイルの先頭を確認するのに便利
headはtailとは逆でファイルの先頭から10行目までを表示するコマンドです。tailと同じように-20などのように表示する行数を指定することができます。
trコマンド 標準入力を整形するコマンド
trコマンド(translateの頭文字?)は標準入力を指定した条件に従って整形して出力するコマンドです。標準入力としてcatコマンドでファイルの中身を出力、パイプでつないでtr処理して出力することが多いと思います。
cat style.txt | tr a-z A-Z > ch_style.txt
編集したものをファイルとして保存する場合には出力リダイレクションでファイルを指定しましょう。
単純に文字を消去したり置換するときには便利ですが、メタキャラクタや正規表現は使えないので複雑なパターンマッチをする場合はsedを使います。
tr 文字列1 文字列2 ー 文字列の置換
入力された文字列のうち文字列1に指定したものを文字列2に変換することができます。
tr komeyan yomeyama
komeyanという文字列をyoneyamaという文字列に変換します。
$ cat file.txt
/home/komeyan/test/txt
$ cat file.txt | tr komeyan yoneyama
/hone/yoneyam/test/txt
文字だけでなくスペースなども指定できます。
# cat file2.txt
ta na ka
# cat file2.txt | tr ' ' '|'
ta|na|ka
小文字を大文字に変換する
a-zや0-9などのように範囲指定することもできます。
$ cat file.txt
/home/komeyan/test/txt
$ cat file.txt | tr a-z A-Z
/HOME/KOMEYAN/TEST/TXT
文字の消去 -d ‘文字列’
tr -d オプションを使うことで指定した文字を削除して出力できます。
空白の削除
# cat file2.txt
ta na ka
# cat file2.txt | tr -d ' '
tanaka
改行の削除
# cat file2.txt | tr -d "\n"
ta na kasakanaroot
連続した文字を一つに置換する -s
tr -sは指定した文字列が1個以上連続して登場する場合、一個に書き変えるコマンドです。わかりにくいと思いますが例えばスペースを指定するとスペースが2個、3個あるものは1個のスペースにします。
$ cat 2file
a b c d e ff
$ cat 2file | tr -s " "
a b c d e ff
cat ファイルの連結
catといえばファイルの内容を表示するコマンドですが、ファイルを複数指定してファイルの内容を連結して表示することができます。
# cat 3file.txt
ta na ka
sakana
sapana
oden
# cat 2file
a b c d e ff
# cat 3file.txt 2file
ta na ka
sakana
sapana
oden
a b c d e ff
uniq 重複しない行を表示
行の中に2行以上重複する行がある場合はそれを1行のみを出力するコマンドです。ただし、重複する行を隣接させる必要があるため、ソートが必須です。
# cat country →coutryの中身を表示
Japan
US
China
Korea
Japan
Japan
China
UK
UK
China
US
Japan
# sort country →ファイルの並び替え
China
China
China
Japan
Japan
Japan
Japan
Korea
UK
UK
US
US
# sort country | uniq →uniqコマンドで重複した行を削除
China
Japan
Korea
UK
US
# cat country | uniq →ソートしない場合はuniqが効かない
Japan
US
China
Korea
Japan
China
UK
China
US
Japan
uniqコマンドに-cを付けると重複した数を表示してくれます。
# sort country | uniq -c
3 China
4 Japan
1 Korea
2 UK
2 US
-dで重複していた行のみ、-uで重複しなかった行のみを出力します。
# sort country | uniq -d
China
Japan
UK
US
# sort country | uniq -u
Korea
cut で特定のパターンを切り出し
cutコマンドではファイルの文字列から特定の条件に当てはまる部分を切り出して表示できます。
列の抽出
cutではテーブルデータを処理できます。特定の列だけを切り出して表示できます。そのためには区切り文字を指定する必要があります。「スペース」や「カンマ」などが区切り文字としてよく使われています。区切り文字の指定は-dオプション、列の指定は-fで行います。
$ cat number
10 100 20
11 232 21
1 23 1
424 12 1
9898 65 54
25 420 764
$ cut -d " " -f 2 number →区切り文字をスペース、2列目を表示
100
232
23
12
65
420
→-f 1,3とすれば1,3列目も表示できる
文字列の部分抽出
文字列の先頭何行などを指定して抽出できます。-c 1-3とすると1~3文字目を表示します。
$ cat 6file
sakana
sakana osakana sakana
sapana
$ cut -c 2-5 6file→2~5列目を表示
akan
akan
apan
$ cut -c 1,6 6file →1,6文字目を表示も可能
sa
sa
sa
sedでテキストを編集して出力
sedはtrよりもより複雑な置換や削除ができるコマンドです。trでは正規表現を使ってパターンマッチはできませんが、sedではパターンマッチが使えます。
sedで文字列置換
sed 's/置換したい文字列/置換文字列/' ファイル名
# cat 3file.txt
ta na ka
sakana →ここをmaguroに置換
sapana
oden
# sed 's/sakana/maguro/' 3file.txt
ta na ka
maguro →sakanaをmaguroに置換
sapana
oden
sed 's/置換したい文字列/置換文字列/g' ファイル名
gを追加すると行全体で置換してくれます。gを入れないと行で最初に登場した文字列のみを置換してそのあとに登場した文字列は置換してくれません。
$ cat 5file
sakana
sakana osakana sakana
sapana
$ sed 's/sakana/maguro/' 5file
maguro
maguro osakana sakana →行の最初に登場するsakanaだけmaguroになっている
sapana
$ sed 's/sakana/maguro/g' 5file
maguro
maguro omaguro maguro →gを入れると全部のsakanaがmaguroになる。
sapana
正規表現で指定もできます。
$ sed 's/o.*na$/maguro/g' 5file
sakana
sakana maguro
sapana
スペースを@に変換
$ sed 's/\s/@/g' 5file →スペースは正規表現で\s
sakana
sakana@osakana@sakana
sapana
スペースを除去
$ sed 's/\s//g' 5file
sakana
sakanaosakanasakana
sapana
$ sed 's/$/88/g' 5file
sakana88
sakana osakana sakana88
sapana88
sedで削除
置換する文字列を空白にすると置換したい文字列を削除することができます。
sed 's/置換したい文字列//g' ファイル名
またdで行を削除できます。
sed '1,3d' ファイル名
というように書くと1~3行目を削除できます。
$ cat 5file
sakana
sakana osakana sakana
sapana
$ sed '1d' 5file
sakana osakana sakanasapana
sapana
$ sed '1,3d' 5file
sakana osakana sakana
awkで高度なテキスト処理
awkは複雑なテキスト処理をすることができるコマンドです。awkは使い方がやや複雑です。
sedやcat、trなどのこれまでのコマンドではデフォルトで画面出力されますが、awkの場合は画面出力を指定してやる必要があります。
awkの基本の文法
$ awk '{コマンド}' ファイル
awkはコマンドの部分にコマンドいれます。画面出力されるにはprintを入れます。ファイル入力はcatからパイプで受け取ることもできます。
cat file.txt | grep day | awk '{print $1}'
最もシンプルなawkを使ったコマンドを下に示します。
$ awk '{print}' 5file
sakana
sakana osakana sakana
sapana
上と同じことをcat使うと
$ cat 5file
sakana
sakana osakana sakana
sapana
awkではprintというコマンドを入れないと画面表示すらできません。逆に、ここにコマンドを入れられるのでより複雑な処理が可能になります。'{ }’この中には変数を入れたり、if構文を入れることもできます。ただ、複雑なテキスト処理やスクリプトを作ったりする場合はperlを使ったほうが良いかもしれません。
awkは上述のように記述に多様性があるので用例を見たほうが良いかもしれません。
指定列を表示
複数列あるファイルのうち指定の番号の列だけを出力するという方法です。
$ awk '{print}' 5file →5fileには3列ある
sakana
sakana osakana sakana
sapana
$ awk '{print $1}' 5file →1列目だけを表示
sakana
sakana
sapana
$ awk '{print $1,$3}' 5file →1,3列目を表示
sakana
sakana sakana
sapana
指定行を表示
行を指定する時は列よりも少しややこしいです。NR==で指定します。
$ awk '{print}' 5file →5fileには3列ある
sakana
sakana osakana sakana
sapana
$ awk 'NR==1;NR==3' 5file
sakana
sapana
NRはNumber of Recordの略です。レコードというのはデーターベースの用語で「行」を意味します。データーベースはエクセルのようなテーブル形式のデータで、行ごとにデータ(レコード)が入っていきます(例:1. 東京都, 男性, 33歳, 5年のように行ごとに入る)。awkでは入力されたファイルのレコード数をNRという変数に入ります。また、論理・比較演算子が使えるので、NR==1レコード数を指定してそれを表示します。NF(Number of Field)という変数はエクセルでいうとセルつまり一つのデータを意味します。
区切りを指定して抽出
awk '{print $1}’で列表示する方法はスペースを区切りとして3列として認識しています。しかし、場合によっては|や@や,で区切られたデータもあります。このように区切りがスペース以外のもので同じく列抽出したい場合は-Fオプションを使用します。
$ awk '{print}' 5file → 5fileの中身
rose,tuna,mike
piano,guitar,soup
tere,
$ awk -F "," '{print $1}' 5file →,で区切って1列目を表示
ros
piano
tere
$ awk '{print $1}' 5file → 区切り文字は未指定では空白
rose,tuna,mike
piano,guitar,soup
tere,
区切り文字を指定しないとデフォルトで空白が区切り文字として認識されます。awk -F " " '{print $1}' 5file
上の例では空白文字がないので区切りがない文として処理されるので何も変化がありません。
区切り文字を複数指定する場合
区切り文字は一つだけでなく複数指定することもできます。
$ awk -F "[,@]" '{print $1}' 5file → ,と@を指定
正規表現で検索 – パターンにマッチする文字列を表示
正規表現はawk '/正規表現/ {print}' ファイル
で指定することで正規表現のパターンにマッチする文字列を表示できます。
$ awk -F "," '/t.*a/ {print $0}' 5file
rose,tuna,mike
piano,guitar,soup
mikeで終わる行を抽出
$ awk '/mike$/ {print}' 5file
rose,tuna,mike
$ cat 5file | grep mike$ →grepで同じ事できる
rose,tuna,mike
この形式ではprintを省略しても表示できる。
$ awk '/mike$/' 5file
rose,tuna,mike
print $0では全体を表示
awkのtips
$0と指定した場合は全列が表示されます。
$ awk '{print $0}' 5file
printで指定する列を「,」でなく「スペース」で区切ると出力が連結される
$ cat 6file
sakana
sakana osakana sakana
sapana
$ awk '{print $1 $2}' 6file
sakana
sakanaosakana →区切り文字が無くなってる
sapana
論理・比較演算子を使って表現
1列目がsakanaの行(レコード)だけを出力
$ cat 6file
sakana
sakana osakana sakana
sapana
$ awk '$1=="sakana"' 6file
sakana
sakana osakana sakana
→3行目はsapanaなので未出力
$ awk '{print $1=="sakana"}' 6file
1
1
0
→{}で囲うと論理演算により真なら1,偽なら0を返す
列の入れ替え
列を入れ替えて出力することもできます。
$ cat number
10 100 20
11 232 21
1 23 1
424 12 1
9898 65 54
25 420 764
$ awk '{print $3,$1,$2}' number →3、1、2列目の順に入れ替える
20 10 100
21 11 232
1 1 23
1 424 12
54 9898 65
764 25 420
$ awk '{print $3"|"$1 "|"$2"|"}' number →区切りを|に変える
20|10|100|
21|11|232|
1|1|23|
1|424|12|
54|9898|65|
764|25|420|
awkの文法
awk 'BEGIN {前処理} {各行に実行するメイン処理} END{処理後のデータに実行する処理}'
参考
awk入門 コマンドの使い方とスクリプトの書き方SE学院
参考
awk入門 コマンドの使い方とスクリプトの書き方SE学院
参考
なるべく書かないawkの使い方 - ザリガニが見ていた...。ザリガニが見ていた...。
参考
awk入門-使い方まとめ一覧 | ITを使っていこうITを使っていこう