for i in {1..255} ; do host 10.1.9.$i ; done |grep not|awk '{print $2}' | awk -F. '{print $1}'> /tmp/filx | for i in `cat /tmp/filx` ; do echo $i ; done
왜 o/p가 표시되지 않는지 모르겠습니다. 파일에 사용되지 않은 IP 값이 있습니다. 감사합니다
답변1
파일로만 리디렉션하기 때문입니다. 다음 명령에 전달하려면 tee
두 가지를 모두 수행하십시오.
... | tee /tmp/filx |...
tee
파일에 쓰고 |
표준 입력에서 읽어 표준 출력을 다음 명령으로 전달하는 데 사용됩니다 .
또는 명령의 이 부분을 /tmp/filx |
또는 로 변경해야 합니다.|
;
&&
답변2
grep
파이프를 사용할 이유가 거의 없습니다 awk
. awk
스스로 패턴 일치를 수행하는 것이 가능합니다. 시도해 보세요 awk '/not/ {print $2}'
.
그리고 awk를 다른 awk로 파이프하는 것은 불필요합니다. 여기서는 .
구분 기호로 기본 공백 대신 필드 구분 기호 세트(공백 및 )를 제공하면 됩니다 .
awk -F'[ .]' '/not/ {print $2}'
for
각 행의 cat
내용을 반복하는 것만으로 echo
는 의미가 없습니다. 실제로 그것은 무의미한 것보다 더 나쁩니다. 느리고 비효율적이며 각 줄을 표준 쉘 토큰화에 적용합니다(이 특정 입력에는 문제가 아니지만 좋은 기술이라고 생각하고 줄에 공백이 포함될 수 있는 입력 파일에 사용하는 경우) .) 그냥 사용하세요 cat
.
cat
하지만 여기서는 사용할 필요조차 없습니다 . stdin을 파일 및 stdout에 복사합니다. 즉, 입력도 파일에 복사 tee
하는 멋진 버전과 같습니다 .cat
tee
언급된 대로 사용αГsнιn의 답변, 전체 단일 라인을 다음과 같이 줄일 수 있습니다.
for i in {1..255} ; do "host 10.1.9.$i" ; done |
awk -F'[ .]' '/not/ {print $2}' |
tee /tmp/flix