我的文件包含以下数据:
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
是一些正整数)匹配的某个子字符串。