使用 AWK 打印列

使用 AWK 打印列

我试图找到一种方法,使用 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: 后跟一个或多个空白字符和一个或多个字母,再是一个或多个空白字符和一个或多个字母,然后将其打印。

相关内容