다음 명령을 사용하여 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
(Jason이 답변에서 이 부분을 설명합니다). 더 자세히 알아볼 수 있습니다:
cat file | sort ...
cat
파일 이름을 지정할 수 있으므로 필요하지 않습니다 sort
. 이전에는 필요하지 않았지만 cat
작동합니다.
sort file | uniq -c | awk ...
uniq -c
is는 중복 항목을 제거하고 개수를 추가하지만 다음은 awk
세 번째 열만 사용하므로 개수는 어쨌든 제거됩니다. -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마일 길이의 명령줄은 단 하나의 파이프와 짧은 스크립트가 있는 간단한 명령줄로 줄어듭니다.sed
working IP
$ d
sort
sed
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$//'
그러나 어떤 입력이 합법적이고 어떤 출력이 예상되는지 알지 못하면 말하기가 어렵습니다.