連続した空白のフィールドを awk ,cut で切り出す

連続した空白(スペース)で区切られたフィールドを取り出す(awk ,cut)

ログなどで設定ファイルで空白で区切られている場合、cutコマンドで「cut -d " " -f3」とかで取り出せますが、連続した空白の場合は正しく取り出せません

$ cat test.txt
0   1      test   a
1   3      test1  b
2   5      test2  c
3   7      test3  d
4   9      test4  e
5  11      test5  f
$ cat test.txt |cut -d " " -f3





11

これを取り出す方法を紹介します

awkコマンドで連続した空白(スペース)で区切られたフィールドを取り出す

awkコマンドで連続した空白で区切られているフィールドを取り出すのは簡単で「cat (ファイル) | awk '{print $3}’」とかで3つ目の区切られているフィールドを取り出せます。awkコマンドでは連続した空白は一つの区切りとして扱われます

書式:cat (ファイル) | awk '{print $(取り出すフィールドの場所)}
例: $ cat /var/tmp/test.txt | awk '{print $2}’
/var/tmp/test.txtのスペース区切りの2つ目を取得しています

 

$ cat test.txt | awk '{print $3}'
test
test1
test2
test3
test4
test5

プロセスコマンドでも同じように連続した空白で区切れています。
下記ではapacheが使用しているプロセスIDを取得しています
$ ps -ef | grep httpd | awk '{print $2}'
1453
2534
3696
4161
4664
5150

cutコマンドで連続した空白(スペース)で区切られたフィールドを取り出す

cutコマンドで連続した空白で区切られているフィールドを取り出すのは難しいので、連続した空白を一つのタブに変換後してから切り出します。
下記では「sed 's/[\t ]\+/\t/g’」で連続した空白を一個のタブに変換してからcutコマンドで切り出しています

$ cat test.txt |sed 's/[\t ]\+/\t/g' | cut -f3
test
test1
test2
test3
test4
test5

プロセスコマンドでも同様に一度タブに変換してからだと正しく連続した空白でも取り出せます

# 連続した空白と区切られている場合はプロセスIDは取り出せない
$ ps -ef | grep httpd  | cut -f2 -d " "

# 連続した空白と区切られている場合は一度タブに変換後にプロセスIDは取り出す
$ ps -ef | grep httpd  |sed 's/[\t ]\+/\t/g' | cut -f2
1753
2234
3696
4161
4664
5150
5151

 

スポンサーリンク