web-dev-qa-db-ja.com

区切り文字のパターンの後のコンテンツの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 =" untilスペースの後に表示されるかを知りたいだけです。

そのコマンドの出力が次のようになっていることを強くお勧めします。

abc|123|bpp123
abc|123|pmk123
abc|123|pnj123

Bashを使用して、$ 3が "modesc ="の後にWordを取得する場所を印刷したいと思います。これを行う方法はありますか?

2
$ 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つの置換で変更します。 1つ目はmodesc=までのすべてを削除し、2つ目は最初の残りのスペース以降のすべてを削除します。最後に1が1つしかない場合、awkは変更されたレコードを出力します(これは{ print }に置き換えられる場合があります)。


のみ元のデータの3番目の列からmodesc=の後の文字列を取得するには(他には何もありません)、上記のコマンドのいずれかを使用してから、それをcut -d '|' -f3にパイプするか、または

sed 's/.*modesc=\([^ ]*\).*$/\1/' file

または

awk -F '|' -vOFS='|' '{ sub(".*modesc=", "", $3); sub(" .*", "", $3); print $3 }' file
1
Kusalananda

awkを使用すると、乗算区切り文字を使用して、かなりのサンプルを実行できます。

awk -F'[|= ]' ' {print $1"|" $2"|" $5}' /tmp/file.log

上記の行でパイプ|、同等の記​​号=とスペースは区切り文字です。

次のように、出力区切り文字を明示的に定義できます。

awk -F'[|= ]' 'BEGIN { OFS="|"}  {print $1,$2,$5}' /tmp/file.log
1
Romeo Ninov

これは効率が低下しますが、タスクはcutおよびpasteにうまく適合します

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

awkの使用:

awk -F\| '{print $1"|"$2"|"gensub(/modesc=(.*) .*$/,"\\1","g",$3)}' /tmp/file.log
0