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'