我有一个名为“script.awk”的简单awk脚本,其中包含:
/\/some_simple_string/ { print $0;}
我用它来解析一些包含以下内容的文件: (通过使用:cat file | awk -f script.awk)
14 catcat one_two/some_thing
15 catcat one_three/one_more_some_simple_string
16 dogdog one_two/some_simple_string_again
17 dogdog one_four/some_simple_string
18 qweqwe firefire/ppp
我希望脚本只打印完全反映“/ some_simple_string [END_OF_LINE]”而不是2或3的笔划。 有没有简单的方法呢?
我认为,最合适的方法是在正则表达式中添加行尾叹息。 所以它只会解析以“/ some ..”开头的笔画,并在“..string [END_OF_LINE]”的末尾有一个新行
期望的输出:
17 dogdog one_four/some_simple_string
很抱歉混淆,我要求在正则表达式中使用END OF LINE登录。 正确答案是:
/\/some_simple_string$/ { print $0;}
答案 0 :(得分:5)
您可以随时使用:
/\/some_simple_string$/ { print $0 }
即。不仅匹配“some_simple_string”而且匹配“/ some_simple_string”后跟行尾($是正则表达式中的行尾)
答案 1 :(得分:3)
grep '\some_simple_string$' file | tail -n 1
应该可以解决问题。
或者,如果您真的想使用awk
执行awk '/\/some_simple_string/{x = $0}END{print x}'
答案 2 :(得分:3)
仅返回一组匹配的 last ,...
将该行存储在变量中并将其打印在END
块中。
/some_simple_string/ { x = $0 }
END{ print x }
答案 3 :(得分:1)
要使用正则表达式打印以字符串/some_simple_string
结尾的所有匹配项,您需要使用$
锚定到该行的末尾。适合这项工作的最合适的工具是grep
:
$ grep '/some_simple_string$' file
在awk
中,命令大致相同:
$ awk '/[/]some_simple_string$/' file
要在匹配后打印所有行:
$ awk 'print_flag{print;f=0} /[/]some_simple_string$/{print_flag=1}' file
如果使用上下文选项grep
更清楚地打印以下行,则只需合并tail
和-A
:
$ grep -A1 '/some_simple_string$' file | tail -n 1