1行でパターンマッチングの前後にフィールドを印刷する

1行でパターンマッチングの前後にフィールドを印刷する

私のファイルには次のデータが含まれています。

tail fn0 logfile
more  tail3 fn0 logfile1
get than tail4 fn0 logfile2

fn0以前のフィールドとfn0以降のフィールドの出力を取得したいと思います。

予想出力:

tail logfile
tail3 logfile1
tail4 logfile2

答え1

あなたはそれを使用することができますawk

awk -v pattern="fn0" '{for (i=0;i<=NF;i++) {if ($i==pattern) print $(i-1),$(i+1) }}' file

または正規表現パターンを使用したい場合:

awk -v pattern="^fn0$" '{for (i=0;i<=NF;i++) {if ($i~pattern) print $(i-1),$(i+1) }}' file

出力:

tail logfile
tail3 logfile1
tail4 logfile2

答え2

そしてperl

$ perl -lane '($i) = grep {$F[$_] eq "fn0"} 0..$#F;
              print "$F[$i-1] $F[$i+1]"' ip.txt
tail logfile
tail3 logfile1
tail4 logfile2
  • -l入力行から改行文字を削除し、印刷時に再度追加します。
  • -aスペースに基づいて入力ラインを分割すると、@F配列にデータが含まれます。
  • ($i) = grep {$F[$_] eq "fn0"} 0..$#F正確な内容を持つ要素のインデックスを取得します。fn0
  • print "$F[$i-1] $F[$i+1]"必須フィールドを印刷してください


sedEREサポート

$ sed -E 's/^(.* )?([^ ]+) fn0 ([^ ]+).*/\2 \3/' ip.txt
tail logfile
tail3 logfile1
tail4 logfile2
  • ^(.* )?行の先頭の選択フィールド
  • ([^ ]+) fn0 ([^ ]+)前後のフィールドキャプチャfn0(単一スペースをフィールド区切り記号と仮定)
  • .*残りの行
  • \2 \3出力の必須フィールド

答え3

grepとsedを使用したソリューション:

egrep -oh '[a-zA-Z0-9]+\ fn0\ [a-zA-Z0-9]+' testfile | sed 's/ fn0 / /'

答え4

$ sed 's/.*\(tail[[:digit:]]*\) fn[[:digit:]]*/\1/' file
tail logfile
tail3 logfile1
tail4 logfile2

このsed式は、各行のすべての内容を一致するいくつかの部分文字列(ここで正の整数)tailXX fnYYで置き換えます。tailXXXXYY

関連情報