我正在寻找从 grep 输出中删除新行的方法,我使用
grep -oP "changed: \[([^]]+)\] =>|'path': '([^']*)'" /path/to/file
输出如下:
changed: [hostname1] =>
'path': '/confluence/app/logs/gc-2023-03-04_20-37-18.log.1'
changed: [hostname2] =>
'path': '/confluence/app/logs/gc-2023-02-04_13-42-42.log.0'
我需要更改关键字,路径将出现在同一行,例如:
changed: [hostname1] => 'path': '/confluence/app/logs/gc-2023-03-04_20-37-18.log.1'
changed: [hostname2] => 'path': '/confluence/app/logs/gc-2023-02-04_13-42-42.log.0'`
我试过
grep -oP "changed: \[([^]]+)\] =>|'path': '([^']*)'" /path/to/file | tr -d '\n'
但它删除了所有新行
答案1
如果需要用grep
空格连接输出的每两行,请通过管道传输至:
paste -d ' ' - -
如果您想提取输入的某行的两部分并用空格将它们连接起来,请使用pcregrep
代替grep -P
(其中在支持该非标准选项的-P
大多数实现中使用PCRE ):grep
-P
pcregrep --om-separator=' ' -o1 -o2 "(changed: \[[^]]+\] =>).*?('path': '[^']*')"
或者perl
,(所有这些中的P
/ ):p
perl -lne 'print "$1 $2" while m{(changed: \[[^]]+\] =>).*?('"'path': '[^']*')}g"
答案2
awk
首先使用。
$ awk "match(\$0, /changed: \[[^]]+\] =>|'path': '[^']*'/)\
{
buf=buf substr(\$0, RSTART, RLENGTH); c++
}
c==2{ print buf; c=buf=nul }" infile
答案3
根据您显示的输出,您可以使用工具来删除每隔一个换行符。例如,在perl
:
$ perl -pe 'chomp if $. % 2' file
changed: [hostname1] =>'path': '/confluence/app/logs/gc-2023-03-04_20-37-18.log.1'
changed: [hostname2] =>'path': '/confluence/app/logs/gc-2023-02-04_13-42-42.log.0'
您可以将其添加到您的末尾grep
:
grep -oP "changed: \[([^]]+)\] =>|'path': '([^']*)'" /path/to/file |
perl -pe 'chomp if $. % 2'
虽然如果我是你,我也会这么做斯蒂芬建议一开始就用 Perl 完成整个事情。
答案4
使用任何 awk:
$ awk '
match($0,/changed: \[[^]]+] =>|\047path\047: \047[^\047]*\047/) {
printf "%s%s", substr($0,RSTART,RLENGTH), (++c % 2 ? OFS : ORS)
}
' file
changed: [hostname1] => 'path': '/confluence/app/logs/gc-2023-03-04_20-37-18.log.1'
changed: [hostname2] => 'path': '/confluence/app/logs/gc-2023-02-04_13-42-42.log.0'