awkで指定したキーワードを持ってる列のみ抽出する
Pocket

awkで指定したキーワードを持ってる列のみを抽出する場合、以下のようにコマンドを実行する。

awk '{for(i=1;i<=NF;i++)if(match($i,"キーワード")) print $i}'

20160804_085235000000

[root@BS-PUB-CENT7-01 ~]# cat /tmp/test.txt
aaa="1" bbb="2" ccc="3" ddd="4"
aaa="11" bbb="21" ccc="31" ddd="41"
aaa="12" bbb="22" ccc="32" ddd="42"
aaa="13" bbb="23" ccc="33" ddd="43"
aaa="14" bbb="24" ccc="34" ddd="44"
aaa="15" bbb="25" ccc="35" ddd="45"
aaa="16" bbb="26" ccc="36" ddd="46"
aaa="17" bbb="27" ccc="37" ddd="47"
aaa="18" bbb="28" ccc="38" ddd="48"
[root@BS-PUB-CENT7-01 ~]# awk '{for(i=1;i<=NF;i++)if(match($i,"bbb")) print $i}' /tmp/test.txt
bbb="2"
bbb="21"
bbb="22"
bbb="23"
bbb="24"
bbb="25"
bbb="26"
bbb="27"
bbb="28"

 

指定したいパターンが複数ある場合は、以下のようにコマンドを実行することで(複数行に分かれるけど)抽出することができる。

awk '{for(i=1;i&lt;=NF;i++)if(match($i,"キーワード1|キーワード2")) print $i}'
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test.txt
aaa="1" bbb="2" ccc="3" ddd="4"
aaa="11" bbb="21" ccc="31" ddd="41"
aaa="12" bbb="22" ccc="32" ddd="42"
aaa="13" bbb="23" ccc="33" ddd="43"
aaa="14" bbb="24" ccc="34" ddd="44"
aaa="15" bbb="25" ccc="35" ddd="45"
aaa="16" bbb="26" ccc="36" ddd="46"
aaa="17" bbb="27" ccc="37" ddd="47"
aaa="18" bbb="28" ccc="38" ddd="48"
[root@BS-PUB-CENT7-01 ~]# awk '{for(i=1;i<=NF;i++)if(match($i,"bbb|ccc")){print $i}}' /tmp/test.txt
bbb="2"
ccc="3"
bbb="21"
ccc="31"
bbb="22"
ccc="32"
bbb="23"
ccc="33"
bbb="24"
ccc="34"
bbb="25"
ccc="35"
bbb="26"
ccc="36"
bbb="27"
ccc="37"
bbb="28"
ccc="38"

 

Sponsored Links

もし同じ行の内容は一行で出力したい場合は、ちょっと汚いけど以下のように書くとよいだろう。

awk '{for(i=1;i<=NF;i++)if(match($i,"キーワード1|キーワード2")){k=k" "$i}if(i=NF)print gensub("^ ","",1,k);k=""}'
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test.txt
aaa="1" bbb="2" ccc="3" ddd="4"
aaa="11" bbb="21" ccc="31" ddd="41"
aaa="12" bbb="22" ccc="32" bbb="3rqt" ddd="42"
aaa="13" bbb="23" ccc="33" ddd="43"
aaa="14" bbb="24" ccc="34" ddd="44"
aaa="15" bbb="25" ccc="35" ddd="45"
aaa="16" bbb="26" ccc="36" ddd="46"
aaa="17" bbb="27" ccc="37" ddd="47"
aaa="18" bbb="28" ccc="38" ddd="48"
[root@BS-PUB-CENT7-01 ~]# awk '{for(i=1;i<=NF;i++)if(match($i,"bbb|ccc")){k=k" "$i}if(i=NF)print gensub("^ ","",1,k);k=""}' /tmp/test.txt
bbb="2" ccc="3"
bbb="21" ccc="31"
bbb="22" ccc="32" bbb="3rqt"
bbb="23" ccc="33"
bbb="24" ccc="34"
bbb="25" ccc="35"
bbb="26" ccc="36"
bbb="27" ccc="37"
bbb="28" ccc="38"

 

Pocket

Written by blacknon

インフラ系のSE。一時期はプログラマ。 仮想化とオープンソースに興味あり。一日中寝てたい今日このごろ。 スペインとかで働きたいなぁ…(シエスタがあるので)

Leave a Comment

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