$ 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 NUMBER
NUMBER
\2
sed
그런데 어떻게 프로그램을 찾아서 실행하고 동시에 교체/수정할 수 있을까요?
결과의 예:
[ 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