명령줄에서 여러 sed 문 사용

명령줄에서 여러 sed 문 사용

아래 명령을 사용하여 각 IP 뒤에 "작업 IP"라는 문구와 함께 한 줄에 IP 주소 목록을 출력하고 있습니다.

cat eciremoteExec1.txt | sort | uniq -c | awk -F " " '{print $3}' | sed 's/$/ working IP/'  | sed -e '0,/ working IP/ s/ working IP//' | sed '$ d' | paste -s -d ' ' | sed 's/working IP$//'

출력은 다음과 같습니다.

147.123.41.112 working IP 129.138.70.113 working IP 173.230.45.54 working 
IP 133.218.250.56 working IP 136.203.152.128 working IP 117.22.29.254 
working IP 117.3.11.111 working IP 127.59.131.236 

내가 원하는 대로 보이도록 sed에 여러 번 파이프했습니다. sed를 여러 번 사용하는 것보다 더 나은 접근 방식이 있습니까?

답변1

여러 명령을 결합하는 것만이 아닙니다 sed(Jasen이 답변에서 해당 부분을 설명했습니다). 더 자세히 알아볼 수 있습니다.

cat file | sort ...

cat파일 이름을 지정할 수 있으므로 필요하지 않습니다. 이전 sort에는 필요하지 않지만cat

sort file | uniq -c | awk ...

uniq -cis는 중복 항목을 제거하고 개수를 추가하지만 다음에서는 awk세 번째 comlun만 사용하므로 개수는 어쨌든 삭제됩니다. 을 삭제 -c하고 전체를 uniq다음 옵션 -u으로 바꿀 수 있습니다 sort.

sort -u file | awk -F " " '{print $2}' | sed ...

여기서는 을 잘못 사용하고 있지만 awk자유롭게 cut -d" " -f 2사용할 수 있습니다. 하지만 이제 에서도 awk해당 단계를 계속 사용하거나 수행할 수 있습니다 sed. 각 도구에서 동일하게 수행할 수 있는 작업을 위해 도구를 전환할 필요가 없습니다.

sort -u file | sed 's/[^ ]* *\([^ ]*\).*/\1 working IP/' ...

입력 파일을 모르면 이상해지기 시작합니다. 그러나 각 줄에 추가하는 경우 working IP처음 나타날 때까지 범위의 모든 줄을 제거하면 첫 번째 줄을 제외한 모든 줄에 추가하는 것과 동일해야 합니다.

sort -u file | sed 's/[^ ]* *//;s/ .*//;1!s/$/ working IP/'

다음으로, 보류 공간의 줄을 수집하고 나중에 첫 번째 줄 바꿈을 공백으로 바꾸고 다른 모든 줄 paste은 . 동시에 마지막 줄( )을 제거 할 수 있으므로 6개의 다른 명령과 8개의 파이프가 있는 전체 1마일 길이의 명령줄은 단 하나의 파이프와 짧은 스크립트 로 간단하게 정리됩니다 .sedworking IP$ dsortsed

sort -u file | sed 's/[^ ]* *//;s/ .*//;$!{H;1h;d;};x;s/\n/ /;s// working IP /g'

man페이지의 옵션을 읽고 각 단계에서 무슨 일이 일어나고 있는지 분석하는 데 평생을 소비하지 않고도 동일한 결과를 얻을 수 있습니다 .

답변2

아마도 처음 세 개의 sed 호출을 다음과 같이 결합하는 것이 가능할 것입니다.

cat eciremoteExec1.txt | sort | uniq -c | awk -F " " '{print $3}' |
   sed 's/$/ working IP/;s/ working IP//; $ d' | paste -s -d ' ' |
   sed 's/working IP$//'

그러나 어떤 입력이 합법적이고 어떤 출력이 원하는지 알지 못하고 말하기는 어렵습니다.

관련 정보