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を使って "modesc ="の直後に$ 3という単語を印刷したいと思います。これを行う方法はありますか?

答え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プログラムは、3番目の列を2つの代替項目に変更します。最初のものはまでのすべてを削除し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+')

関連情報