テキストの処理・編集を行うsed awk cut trコマンドをまとめ

テキストの処理・編集のコマンド

テキストの表示・編集処理を行うコマンド

CUIの操作が基本であるLinuxサーバではコマンドライン上でテキスト表示・編集ができると便利です。

ログなどから見たい部分だけを表示できるようになると操作が捗ります。

コマンドでのテキスト表示・編集スキルはLinux操作の基本となるためコマンドの種類や操作方法を覚えておきましょう。

テキストの表示

テキストを表示する標準的なコマンドには以下のものがあります。

  • echo
  • cat
  • less
  • more

tailコマンド ファイルの末尾を表示!ログの監視に!

tailはファイルの末尾を表示するコマンドです(デフォルトは末尾から10行目まで)。

最新情報はファイルの末尾に書いてあるのでtailは最新情報を見たい時に便利です。

例えばログファイルの最新情報を見たい時にtailは使えます。

log tail
logの最新情報をtailコマンドで確認。オプションで5行目まで表示

tail -fを使用するとそのファイルをリアルタイムに開き続けることができるため、リアルタイムに書き出されたログを確認することができて便利です。

コマンド実行時にそれが実際に反映されたか?というのを調べることもできます。

less +Fがあります。lessなので前の情報を参照できるので便利です。

参考 tail -fやtailfを使うのはやめてless +Fを使おう - Qiita取得できませんでした

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 kasakanasapanaoden
# cat 2file
a b c d e ff
# cat 3file.txt 2file
ta na kasakanasapanaodena b c d e ff

uniq 重複しない行を表示

行の中に2行以上重複する行がある場合はそれを1行のみを出力するコマンドです。ただし、重複する行を隣接させる必要があるため、ソートが必須です。

# cat country  →coutryの中身を表示
JapanUSChinaKoreaJapanJapanChinaUKUKChinaUSJapan
# sort country  →ファイルの並び替え
ChinaChinaChinaJapanJapanJapanJapanKoreaUKUKUSUS
# sort country | uniq →uniqコマンドで重複した行を削除
ChinaJapanKoreaUKUS
# cat country | uniq →ソートしない場合はuniqが効かない
JapanUSChinaKoreaJapanChinaUKChinaUSJapan

uniqコマンドに-cを付けると重複した数を表示してくれます。

# sort country | uniq -c
3 China4 Japan1 Korea2 UK2 US

-dで重複していた行のみ、-uで重複しなかった行のみを出力します。

# sort country | uniq -d
ChinaJapanUKUS
# sort country | uniq -u
Korea

cut で特定のパターンを切り出し

cutコマンドではファイルの文字列から特定の条件に当てはまる部分を切り出して表示できます。

列の抽出

cutではテーブルデータを処理できます。特定の列だけを切り出して表示できます。そのためには区切り文字を指定する必要があります。「スペース」や「カンマ」などが区切り文字としてよく使われています。区切り文字の指定は-dオプション、列の指定は-fで行います。

$ cat number
10 100 2011 232 211 23 1424 12 19898 65 5425 420 764
$ cut -d " " -f 2 number 区切り文字をスペース、2列目を表示
100232231265420

→-f 1,3とすれば1,3列目も表示できる

文字列の部分抽出

文字列の先頭何行などを指定して抽出できます。-c 1-3とすると1~3文字目を表示します。

$ cat 6file
sakanasakana osakana sakanasapana
$ cut -c 2-5 6file→2~5列目を表示
akanakanapan
$ cut -c 1,6 6file →1,6文字目を表示も可能
sasasa

sedでテキストを編集して出力

sedはtrよりもより複雑な置換や削除ができるコマンドです。trでは正規表現を使ってパターンマッチはできませんが、sedではパターンマッチが使えます。

sedで文字列置換

sed 's/置換したい文字列/置換文字列/' ファイル名

# cat 3file.txt
ta na kasakana →ここをmaguroに置換sapanaoden
# sed 's/sakana/maguro/' 3file.txt
ta na kamaguro →sakanaをmaguroに置換sapanaoden
sed 's/置換したい文字列/置換文字列/g' ファイル名 

gを追加すると行全体で置換してくれます。gを入れないと行で最初に登場した文字列のみを置換してそのあとに登場した文字列は置換してくれません。

$ cat 5file
sakanasakana osakana sakanasapana
$ sed 's/sakana/maguro/' 5file
maguromaguro osakana sakana →行の最初に登場するsakanaだけmaguroになっているsapana
$ sed 's/sakana/maguro/g' 5file
maguromaguro omaguro maguro →gを入れると全部のsakanaがmaguroになる。sapana

正規表現で指定もできます。

$ sed 's/o.*na$/maguro/g' 5file
sakanasakana magurosapana

スペースを@に変換

$ sed 's/\s/@/g' 5file →スペースは正規表現で\s
sakanasakana@osakana@sakanasapana

スペースを除去

$ sed 's/\s//g' 5file
sakanasakanaosakanasakanasapana
$ sed 's/$/88/g' 5file
sakana88sakana osakana sakana88sapana88

sedで削除

置換する文字列を空白にすると置換したい文字列を削除することができます。

sed 's/置換したい文字列//g' ファイル名 

またdで行を削除できます。

sed '1,3d' ファイル名 

というように書くと1~3行目を削除できます。

$ cat 5file
sakanasakana osakana sakanasapana
$ sed '1d' 5file
sakana osakana sakanasapanasapana
$ 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
sakanasakana osakana sakanasapana

上と同じことをcat使うと

$ cat 5file
sakanasakana osakana sakanasapana

awkではprintというコマンドを入れないと画面表示すらできません。逆に、ここにコマンドを入れられるのでより複雑な処理が可能になります。'{ }’この中には変数を入れたり、if構文を入れることもできます。ただ、複雑なテキスト処理やスクリプトを作ったりする場合はperlを使ったほうが良いかもしれません。

awkは上述のように記述に多様性があるので用例を見たほうが良いかもしれません。

指定列を表示

複数列あるファイルのうち指定の番号の列だけを出力するという方法です。

$ awk '{print}' 5file →5fileには3列ある
sakanasakana osakana sakanasapana
$ awk '{print $1}' 5file →1列目だけを表示
sakanasakanasapana
$ awk '{print $1,$3}' 5file →1,3列目を表示sakanasakana sakanasapana

指定行を表示

行を指定する時は列よりも少しややこしいです。NR==で指定します。

$ awk '{print}' 5file →5fileには3列ある
sakanasakana osakana sakanasapana
$ awk 'NR==1;NR==3' 5file
sakanasapana

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,mikepiano,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
sakanasakana osakana sakanasapana
$ awk '{print $1 $2}' 6file
sakanasakanaosakana →区切り文字が無くなってるsapana

論理・比較演算子を使って表現

1列目がsakanaの行(レコード)だけを出力

$ cat 6file
sakanasakana osakana sakanasapana
$ awk '$1=="sakana"' 6file
sakanasakana osakana sakana
3行目はsapanaなので未出力
$ awk '{print $1=="sakana"}' 6file
110

→{}で囲うと論理演算により真なら1,偽なら0を返す

列の入れ替え

列を入れ替えて出力することもできます。

$ cat number
10 100 2011 232 211 23 1424 12 19898 65 5425 420 764
$ awk '{print $3,$1,$2}' number →3、1、2列目の順に入れ替える
20 10 10021 11 2321 1 231 424 1254 9898 65764 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を使っていこう

コメントを残す

メールアドレスが公開されることはありません。