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'