
ファイルがあると言う
#cat file.log
abc|123|text1 modesc=bpp123 raw_info=clear
abc|123|text2 modesc=pmk123 severity=minor
abc|123|text3 modesc=pnj123 info=good
印刷された$3の単語が「modesc=」の後にスペースまで表示されるかどうかだけを知りたい。
このコマンドの出力が次のようになることを望みます。
abc|123|bpp123
abc|123|pmk123
abc|123|pnj123
bash を使用して、$3 が "modesc=" の後の単語を取得する場所を印刷したいのですが、これを行う方法はありますか?
答え1
$ sed 's/[^|]*modesc=\([^ ]*\).*$/\1/' file
abc|123|bpp123
abc|123|pmk123
abc|123|pnj123
これは、最後のフィールド全体を次のスペースまでのsed
内容で置き換えるために使用されます。modesc=
$ awk -F '|' -vOFS='|' '{ sub(".*modesc=", "", $3); sub(" .*", "", $3)} 1' file
abc|123|bpp123
abc|123|pmk123
abc|123|pnj123
このawk
プログラムは、2 つの置換によって 3 番目の列を変更します。最初の置換では までのすべてを削除しmodesc=
、2 番目の置換では最初の残りのスペースの後のすべてを削除します。1
最後の により、 はawk
変更されたレコードを印刷します (これは に置き換えられる場合があります{ print }
)。
にのみ元のデータの3列目以降の文字列を取得するにはmodesc=
(他のものは取得しない)、上記のいずれかのコマンドを使用してそれをパイプするcut -d '|' -f3
か、
sed 's/.*modesc=\([^ ]*\).*$/\1/' file
または
awk -F '|' -vOFS='|' '{ sub(".*modesc=", "", $3); sub(" .*", "", $3); print $3 }' file
答え2
複数の区切り文字を使用してawk
、サンプルとして実行できます。
awk -F'[|= ]' ' {print $1"|" $2"|" $5}' /tmp/file.log
上記の行のパイプでは|
、等号=
とスペースが 区切り文字です。
出力区切り文字を次のように明示的に定義できます。
awk -F'[|= ]' 'BEGIN { OFS="|"} {print $1,$2,$5}' /tmp/file.log
答え3
使用方法awk
:
awk -F\| '{print $1"|"$2"|"gensub(/modesc=(.*) .*$/,"\\1","g",$3)}' /tmp/file.log
答え4
これは効率は悪くなりますが、タスクはうまく適合しcut
、paste
paste -d '|' <(cut -d'|' -f1-2 file.log) <(cut -d'|' -f3 file.log | grep -oP 'modesc=\K\S+')