다음과 같은 스크립트를 실행한다고 가정해 보겠습니다.
/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