bash - grep后查找字符串

标签 bash awk grep cut

我有这个文件:

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/

相关文章:

bash - 通过索引访问 $*(或 $@)的元素

arrays - bash shell 数组输出范围到 csv

Bash 删除路径中的前导/

linux - 将 awk 日志保存在尾部后的命令

bash - 解析 iw wlan0 扫描输出

grep - 使用 grep 查找方法的参数

linux - 读取数字,然后将它们添加到一个循环中。庆典/Linux

linux - 如何仅从文件中的 URL 中去除 & 符号?

linux - grep ps 的输出,排除单词 grep

javascript - 使用 grep 捕获 javascript 链接