从 grep 输出中删除尾随换行符

从 grep 输出中删除尾随换行符

我正在寻找从 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'

相关内容