Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 在一行中Grep多个字符串_Unix_Awk_Sed_Grep - Fatal编程技术网

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