我想使用 awk 来打印某些模式的匹配,前提是它是某些常量文本之前的文件的最后一行。
例如,我只想打印“c”的值,仅当它是某些常量文本之前的最后一行时:
cat file.txt:
a=1
b=2
c=3
...constant text...
打印 3.
cat file.txt:
a=1
c=3
b=2
...constant text...
不要打印任何东西。
我怎么做..? awk 如何知道它是否是文件的最后一个数字?
答案1
我想使用 awk 来打印某些模式的匹配,前提是它是某些常量文本之前的文件的最后一行。
在这种情况下,请尝试以下操作:
awk -F= '/constant text/ && name=="c"{print value} {name=$1;value=$2}' file
例子
$ cat file1
a=1
b=2
c=3
...constant text...
$ awk -F= '/constant text/ && name=="c"{print value} {name=$1;value=$2}' file1
3
$ cat file2
a=1
c=3
b=2
...constant text...
$ awk -F= '/constant text/ && name=="c"{print value} {name=$1;value=$2}' file2
$
怎么运行的
-F=
这告诉
awk
我们用作=
字段分隔符。这样,我们就可以将a=1
或等字段的名称和值分开c=3
。/constant text/ && name=="c"{print value}
如果我们到达带有
constant text
andname
(如上一行最后设置的) is 的行c
,则打印value
。name=$1;value=$2
对于当前行,将第一个字段保存为
name
,第二个字段保存为value
。
答案2
如果您不介意使用 grep,它可以选择在匹配之前打印行。
选项是:-B num,--before-context=num
在你的情况下:
cat file.txt|grep -B 1 "constant text"|grep "c="|cut -f2 -d'='
解释 :
- 仅打印常量文本之前的行。
- 从输出中过滤所有 c 值。
- 使用“=”分隔符提取第二个字段。
答案3
一些谷歌搜索找到了迄今为止最好的答案,尽管我已经得到了答案:使用tac
使它变得更简单......
tac file | awk 'NR==2{if ( $1=="c") print $2}'
行号是“常量文本”之后的一行。如果“常量文本”是一行 - NR==2
.如果是两行 - NR==3
.还没有决定常量文本应该是什么格式......