区切り文字のパターンの後の内容を grep で検索

区切り文字のパターンの後の内容を grep で検索

ファイルがあると言う

#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

これは効率は悪くなりますが、タスクはうまく適合しcutpaste

paste -d '|' <(cut -d'|' -f1-2 file.log) <(cut -d'|' -f3 file.log | grep -oP 'modesc=\K\S+')

関連情報