unix - 在一行中 Grep 多个字符串

标签 unix awk sed grep

我试图在一行中定位两个字符串。下面是示例行。

line1: xxxx yyyy time1-12 zzzz time2-13
line2: xxxx yyyy time1-14 zzzz time2-15

我正在使用下面的 grep 命令来实现这一点

grep -o -E 'time1-[0-9]*|time2-[0-9]*' timetest.txt

这给我的输出是

time1-12
time2-13
time1-14
time2-15

但是我想要这样

time1-12 time2-13
time1-14 time2-15

我在这里缺少什么?我可以使用 awk 还是 sed 来获得这个输出

最佳答案

使用 GNU awk 来匹配第三个参数():

$ awk 'match($0,/time1-[0-9]*/,a) && match($0,/time2-[0-9]*/,b) { print a[0], b[0] }' file
time1-12 time2-13
time1-14 time2-15

注意time1和time2可以任意顺序就行。对于其他 awk,您需要使用 substr() 来提取 match() 结果:

$ awk 'match($0,/time1-[0-9]*/) && (a=substr($0,RSTART,RLENGTH)) && match($0,/time2-[0-9]*/) { print a, substr($0,RSTART,RLENGTH) }' file
time1-12 time2-13
time1-14 time2-15

如果这 2 次总是以相同的顺序进行,那么使用 gawk 你可以这样做:

$ awk 'match($0,/(time1-[0-9]*).*(time2-[0-9]*)/,a) { print a[1], a[2] }' file
time1-12 time2-13
time1-14 time2-15

但是这只是对单独一行的简单替换,所以你也可以只使用 sed:

$ sed -r 's/.*(time1-[0-9]*).*(time2-[0-9]*).*/\1 \2/' file
time1-12 time2-13
time1-14 time2-15

关于unix - 在一行中 Grep 多个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33148292/

相关文章:

regex - 如何在 perl 中使用 split 函数来完成 awk 的工作

xml - sed 查找并替换 xml 文件中的值

bash - Dockerfile不会替换文本,但是命令行会替换文本,可能是错误?

svn - rsync pop_dir "/home/user_x"失败 : permission denied, 为什么?

bash - Grep 只搜索一行?

linux - awk/sed/grep命令比较三个文件的内容

Bash:获取命令行程序执行的输出并设置为变量

ubuntu - 如何组成一个sed脚本文件?

c - 使用套接字通过C中的SOCKS5代理服务器发送请求

php - 如何在 php 中将日期和时间转换为 unix 时间戳?