在单行匹配模式之前和之后打印字段

在单行匹配模式之前和之后打印字段

我的文件包含以下数据:

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 fnYYtailXX(其中XXYY是一些正整数)匹配的某个子字符串。

相关内容