리디렉션되지 않도록 특정 줄 제외[닫기]

리디렉션되지 않도록 특정 줄 제외[닫기]

다음과 같은 스크립트를 실행한다고 가정해 보겠습니다.

/a/b/c/script.sh >> abc.log

abc.log이는 스크립트의 특정 줄을 원할 경우 스크립트의 모든 내용/실행이 로 리디렉션됨을 의미합니다 .아니요로 리디렉션됩니다 abc.log. 어떻게 해야 합니까?

답변1

/a/b/c/script.sh >> abc.log

이 명령은 script.sh작성된 모든 출력이표준 출력 스트림에 첨부됩니다abc.log

유사한 패턴과 일치하는 하나 이상의 행을 제외하려면 grep -v다음을 사용하여 이를 수행할 수 있습니다.

/a/b/c/script.sh | grep -v '<line-to-ignore>' >> abc.log

또는 패턴을 일치시킵니다(예: 단어 cat으로 시작하는 모든 줄).

/a/b/c/script.sh | grep -vE '^cat' >> abc.log

grep 플래그는 -v일치 항목을 반전시키는 것을 의미하므로 제공한 패턴과 일치하는 모든 행이 필터링됩니다.

답변2

스트림에서 행을 "제거"하는 것을 포함하여 유사한 도구를 사용하여 sed출력을 변경할 수 있습니다. script.sh행 단위로 삭제하려면 다음을 수행하십시오.

/a/b/c/script.sh | sed -e '5d' >> abc.log

이 예에서는 다섯 번째 행이 출력에서 ​​제거됩니다. 5임의의 줄 번호로 바꿉니다 .

/a/b/c/script.sh | sed -e '/<regex>/d' >> abc.log

정규식과 일치하는 모든 줄은 출력에서 ​​제거됩니다.

답변3

라인을 선택할 수 없습니다. 전체 스트림( stdin, stdout, stderr(더 일반적으로는 이러한 표준 파일 설명자뿐만 아니라 모든 열린 파일 설명자))만 리디렉션될 수 있습니다.

출력 라인을 정리하는 명령을 파이핑하여 원하는 것을 시뮬레이션할 수 있습니다.

$ echo -e "hello\nworld"   |  #write hello and world; one per line
tee >(grep hello >1.log) |  #select line matching hello and write it to 1.log
grep -v hello > 2.log  #select lines NOT matching hello and write them to 2.log

답변4

스크립트의 특정 줄/명령인 경우 해당 출력을 /dev/null스크립트 내부로 보낼 수 있습니다. 스크립트 내의 명령은 다음과 같습니다.

command > /dev/null

이로 인해 출력이 손실됩니다. 콘솔에 표시하려면 다음 stderr으로 보낼 수 있습니다.

command 2> `tty` 1>&2

관련 정보