我试图找到一种方法,使用 awk 仅在找到搜索参数后才开始打印,并仅打印其后面的几列。
为了更好地解释,我正在查看一个日志文件,该文件将大量信息打印为一行。我只想采取并推断该路线的某些方面。 IE 有一个大文件,其中包含以下行:
等等等等,这里有很多关于名字的信息:John Doe,它一直在继续,不会停止。
我希望它搜索名称并仅打印出来:
姓名:约翰·多伊
我知道我可以使用列段,但我实际上不知道该行名称在不同的文件中位于什么位置。
答案1
最简单的答案不会涉及awk
。它将使用grep
, 输出单词“name”的任何匹配项,以及后面最多两个单词:
grep -o 'name [A-Za-z]* [A-Za-z]*' filename
开关-o
仅包括匹配的部分,而不是整条线路;并[A-Za-z]*
表明您正在询问一个单词。
如果您愿意这样做,请告诉我awk
——但这会复杂得多。
答案2
这也可以通过以下方式完成awk
:
$ awk 'match( $0, /name [A-Z][a-z]* [A-Z][a-z]*/ ) { print substr( $0, RSTART, RLENGTH ) }' /path/to/inputfile
答案3
珀尔解决方案:
perl -lne '/(name:\s+\w+\s+\w+)/ and print $1'
\s
匹配空白字符(每次查看的空白、表格等)\w
匹配字母和数字-lne
表示不打印任何内容 (n),除非使用 print 时,在末尾输出换行符 (l) 并执行 (e) 以下内容
因此,整行将匹配 name: 后跟一个或多个空白字符和一个或多个字母,再是一个或多个空白字符和一个或多个字母,然后将其打印。