문자열이 있는 줄을 변경하기 위해 문자열을 인수로 전달한 다른 프로그램의 출력을 어떻게 사용할 수 있습니까?

문자열이 있는 줄을 변경하기 위해 문자열을 인수로 전달한 다른 프로그램의 출력을 어떻게 사용할 수 있습니까?
$ cat sample.dmesg.log | sed -re 's/(READ block )([0-9]+)( on xvda3.*$)/\1\2\3 XXX/g'
[ 6031.953619] sysctl(20774): READ block 5285528 on xvda3 (32 sectors) XXX
[ 6031.954317] sysctl(20774): READ block 5285768 on xvda3 (8 sectors) XXX
[ 6031.954598] sysctl(20774): READ block 5285648 on xvda3 (120 sectors) XXX
[ 6031.954617] sysctl(20774): READ block 5285776 on xvda3 (24 sectors) XXX
[ 6031.955482] sysctl(20774): READ block 5285560 on xvda3 (88 sectors) XXX
[ 6031.955699] sysctl(20774): READ block 4473568 on xvda3 (8 sectors) XXX
[ 6031.955730] sysctl(20774): READ block 4473584 on xvda3 (16 sectors) XXX
[ 6031.955787] sysctl(20774): READ block 4749496 on xvda3 (224 sectors) XXX

예를 들어 각 입력 라인에 대해 위의 내용을 위 의 XXX명령 실행 결과 (두 번째 그룹) 로 바꾸고 싶습니다 . 5285528 ./showblock NUMBERNUMBER\2sed

그런데 어떻게 프로그램을 찾아서 실행하고 동시에 교체/수정할 수 있을까요?

결과의 예:

[ 6031.953619] sysctl(20774): READ block 5285528 on xvda3 (32 sectors) Path: /usr/lib64/libgpg-error.so.0.24.2

동일한 명령 sed이나 다른 명령을 사용하여 이 작업을 수행할 수 있기를 바랍니다.하나주문하다?

이 질문을 보다 일반적이고 유용하게 바꾸기 위해 어떻게 바꿔야 할지 아는 사람이 있다면 그렇게 하십시오.

즉, 정규식/정규식 일치 중에 외부 프로그램을 실행하는 방법은 무엇입니까?

답변1

펄을 사용해 보세요:

perl -pe '
    s{(READ block) (\d+) (on xvda3.*$)}
     {join " ",$1, $2, $3, qx(./showblock $2)}e
' sample.dmesg.log

후행 줄 바꿈을 제거하려면 다음을 수행하십시오.

     { chomp($out = qx(./showblock $2)); join " ", $1, $2, $3, $out }e

관련 정보