bash 스크립트가 마지막 파이프 파일을 읽지 않습니다.

bash 스크립트가 마지막 파이프 파일을 읽지 않습니다.
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

관련 정보