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'

관련 정보