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

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

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

linuxはCUIで操作することが多いためテキストの表示や処理は重要です。テキストの表示ひとつとっても表示方法がいくつかあります。必要な部分表示したりテキストを編集したりすることはLinuxを操作する上で基本となるスキルであるため、コマンドの種類や操作方法を学んでおきましょう。

テキストの表示

テキストを表示する標準的なコマンドにはecho, cat, less, moreなどがあります。

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

tailコマンドはデフォルトでファイルの末尾から10行目までを表示するコマンドです。テキスト行数が膨大で更新されていく種類のファイルで最新情報のみを知りたいときに使うコマンドです。例えばログファイルなどが当てはまります。ログファイルは末尾に最新情報が記録されていきます。

log tail

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

また、ログを監視する時にもtailコマンドは使います。fオプションを使うと最新情報を更新し続けます。マシンの状態を監視するのに便利です。tail -fのように使います。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(delete) 引数の文字があったら削除 tr A-Z a-z 大文字小文字を変換 cat HOGE.txt | tr A-Z a-z > hoge.txt -d “\r”で改行コードを削除 -exec {} \; は別々に渡す

文字の消去 -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

cutコマンドは
/home/hosttxt/client/signal/staff.txt:%masanori
/home/hosttxt/client/steve/staff.txt:%masanori
という文字列があった時、cut -d “区切り文字” 、cut -d “/” とすると/を区切りとして複数のフィールドに分ける
「空白」home hosttxt client signal staff.txt:%masanoriの6フィールドに分かれる

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 sakana
sapana
$ sed '1,3d' 5file
$

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列目を表示
rose
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を使っていこう

コメントを残す

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