我有这个文件:
a=1 b=2 1234j12342134h d="a v" id="y_123456" something else
a=1 b=2 1234j123421341 d="a" something else
a=1 b=2 1234j123421342 d="a D v id=" id="y_123458" something else
a=1 b=2 1234j123421344 d="a v" something else
a=1 b=2 1234j123421346 d="a.a." id="y_123410" something else
我只想检索包含“id=”的行,以及 id 和第三列的值。最终产品应该是
1234j12342134h id="y_123456"
1234j123421342 id="y_123458"
1234j123421346 id="y_123410"
或
1234j12342134h "y_123456"
1234j123421342 "y_123458"
1234j123421346 "y_123410"
甚至
1234j12342134h y_123456
1234j123421342 y_123458
1234j123421346 y_123410
我尝试了 grep -o
作为表达式的开始和结束,但是错过了第一个 ids block 。我尝试了 awk,但是对于带有空格的列失败了。
我可以使用 Java 来运行它,但是随着日志文件变大,它会变慢。
如何使用 bash 实用程序来做到这一点?
最佳答案
使用 GNU awk(对于 match() 的第三个参数):
$ gawk 'match($0,/id="[^" ]+"/,a){ print $3, a[0] }' file
1234j12342134h id="y_123456"
1234j123421342 id="y_123458"
1234j123421346 id="y_123410"
与其他 awks 一起使用:
$ awk 'match($0,/id="[^" ]+"/){ print $3, substr($0,RSTART,RLENGTH) }' file
1234j12342134h id="y_123456"
1234j123421342 id="y_123458"
1234j123421346 id="y_123410"
或者,如果您想删除一些前导/尾随字符,有几种方法:
$ gawk 'match($0,/id="([^" ]+)"/,a){ print $3, a[1] }' file
1234j12342134h y_123456
1234j123421342 y_123458
1234j123421346 y_123410
或者:
$ awk 'match($0,/id="[^" ]+"/){ print $3, substr($0,RSTART+4,RLENGTH-5) }' file
1234j12342134h y_123456
1234j123421342 y_123458
1234j123421346 y_123410
关于bash - grep后查找字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31189297/