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出力の2行すべてをスペースで連結する必要がある場合は、次にパイプします。

paste -d ' ' - -

入力行の2つの部分を抽出してスペースで連結するには、代わりに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'

関連情報