私のファイルには次のデータが含まれています。
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]"
必須フィールドを印刷してください
sed
EREサポート
$ 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
で置き換えます。tailXX
XX
YY