Unix 在一行中Grep多个字符串
我试图在一行中找到两个字符串。下面是示例行Unix 在一行中Grep多个字符串,unix,awk,sed,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 ti
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来获得这个输出吗
perl -lne 'print "$1 $2" if /(time1-[0-9]+).*(time2-[0-9]+)/' timetest.txt
代码假定time1
总是在time2
之前出现,请尝试此sed命令
sed 's/[^t]\+\(time[^ ]\+\)/\1 /g' FileName
或
输出:
time1-12 time2-13
time1-14 time2-15
Cut
version
cut -d" " -f 4,6 FileName
另一种解决方案,使用
grep
grep -o -E 'time[0-9]+-[0-9]+' timetest.txt | paste -d " " - -
你得到
time1-12 time2-13
time1-14 time2-15
时间1-12时间2-13
时间1-14时间2-15
使用GNU awk匹配第三个参数() 请注意,time1和time2可以是该行中的任意顺序。对于其他awk,您需要使用substr()来提取match()结果: 如果这两次的顺序始终相同,那么使用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
试试
awk'{print$4”“$6}timetest.txt
这也是我的想法。唯一的困难是:如果每行上没有2个匹配项,则输出可能会合并来自不同行的匹配项。这只会打印包含以time
开头的字符串的任何行的末尾,而不会查找OP关心的2个特定regexp。
$ 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
$ 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 -r 's/.*(time1-[0-9]*).*(time2-[0-9]*).*/\1 \2/' file
time1-12 time2-13
time1-14 time2-15
awk -vRS="time[12]-[0-9]+" '{$0=RT}1' filename
time1-12
time2-13
time1-14
time2-15