여러 유닉스 명령을 하나의 출력으로 결합


9

메일 로그에서 특정 이메일 주소를 검색해야합니다. 우리는 maillog 라는 현재 파일 과 일주일 분량의 .bz2 파일을 동일한 폴더에 보관합니다. 현재 파일을 검색하기 위해 다음 명령을 실행 중입니다.

grep person@domain.com maillog
bzgrep person@domain.com *.bz2

grepbzgrep명령을 단일 출력 으로 결합하는 방법이 있습니까? 이렇게하면 결합 된 결과를 단일 전자 메일 또는 단일 파일로 파이프 할 수 있습니다.

답변:


24

다른 방법은

{ grep ...; bzgrep ...;} >file

&&실패 bzgrep하면 실행되지 않는 어려움이 있습니다 grep.

마지막 명령 뒤에 여는 중괄호와 세미콜론 뒤에 필수 공간이 있습니다. 또는 괄호가 아닌 서브 쉘 구문 (중괄호 대신 괄호)을 사용할 수 있습니다.

(grep ...; bzgrep ...) >file

이 문제에 대한 최상의 범용 쉘 접근 방식은 +1입니다. 셸 그룹화는 일반적으로 활용도가 낮은 기능입니다.
Phil Hollenback

2
당신은 ()대신에 의미 하지 {}않습니까?
Ehtesh Choudhury

아치 리눅스에서는 이것이 작동 ()했지만 {}, 어느 쪽이든 +1이었습니다.
Chris Magnuson

11

파일이 압축되지 않은 경우 bzgrep는 자동으로 일반 grep으로 기본 설정됩니다. 따라서 다음으로 충분해야합니다.

bzgrep person@domain.com maillog *bz2 | mail -s "logs yay" someuser@blah

물론 여기 필자의 의무적 인 GNU Parallel 솔루션도 있습니다.

parallel -m bzgrep person@domain.com ::: maillog* *bz2 | mail -s "logs yay" someuser@blah

많은 파일을 확인하는 경우 훨씬 빠를 수 있습니다.


2

여기에 또 다른 방법이 있습니다 (아마도 bash를 실행 중이라고 가정).

cat <(bzgrep ...) <(grep ...)

여기에서 bash는 bzgrep 및 grep 명령의 출력을 마치 파일처럼 고양이에 투명하게 공급합니다.

귀하의 특별한 경우 Phil의 솔루션을 추천하지만 위의 내용은 귀하의 가방에 보관하는 좋은 방법입니다.

관심이 있으시면 여기를 참조하십시오 : http://www.tldp.org/LDP/abs/html/process-sub.html


아, 그렇습니다. '두 프로세스의 결과를 어떻게 다른가?'에 대한 정식 답변. 알아두면 좋은 트릭입니다.
Phil Hollenback

1

필자가이 글을 쓰는 시점에서을 포함하여 대부분의 Bourne 파생 쉘에서 허용되는 답변의 구문이 잘못되었습니다 bash. 나는 상단에 대한 편집을 제안하고 그 문제를 해결하기 위해 대답을 받아 들였지만 다른 모든 정보를 추가하는 경향이 있었고 이것은 편집 대신 다시 작성했을 것입니다.

복합 명령을 사용할 수 있습니다.

{ grep ...; bzgrep ...; } >file

.. 또는 서브 쉘 (중괄호 대신 괄호에 유의) :

(grep ...; bzgrep ...) >file

.. 명령을 그룹화합니다. 서브 쉘 방식은 구문이 더 우수하지만 (공백이 부족함을 더 많이 허용하고 마지막 세미콜론을 생략 할 수 있음) 새로운 프로세스를 분기 시키거나 정리 된 환경에서 명령을 실행하여 "가장 척합니다". 둘 다 원하는 일에 따라 장점이 있지만 여기서는 중요하지 않지만 쉘에 더 능숙한 것을 원한다면 찾아 볼 가치가 있습니다.

참고 : 이러한 트릭과 함께 파이프 라이닝을 사용할 수 있으므로 다음과 같은 작업을 수행 할 수 있습니다.

{ grep ...; bzgrep ...; } | less

PS 조합 된 출력에서 ​​일치하는 순서를 신경 쓰지 않으면 &두 명령 사이 에 단일을 사용할 수 있습니다 { grep ... & bzgrep ...; }. 그런 다음 두 명령이 동시에 실행됩니다. Gets grep가 시작되고 셸이 백그라운드에 넣은 다음 셸이을 실행합니다 bzgrep. (그러나 파일 리디렉션 및 파일 스트림 버퍼링과 관련된 설명과 함께 출력 파일의 라인의 아주 작은 부분이 분리 / 혼합되는 작은 경고가 있습니다 grep. bzgreplibc stdio.h기능이 구현된다. 대부분의 구현에서, 당신이 할 수 있도록 문제를 방지하는 파일로 리디렉션하기 전에 명령을 파이프 믿는 { foo & bar; } | cat - >file해결 방법으로.)


0

명령을 &&와 함께 묶어 각 명령을 실행할 수 있습니다.

또한 각 명령의 끝에 >> textfile.txt를 추가하고 출력이 파일에 도달 한 다음 해당 파일을 메일로 보낼 수 있습니다.


2
geekosaur가 언급했듯이, grep의 반환 값은 무언가를 찾았는지 여부에 따라 달라지기 때문에 &&를 사용해서는 안됩니다. 그럴 grep ... && bzgrep ...경우 grep에 적중이 없으면 실패를 리턴하고 명령이 중지됩니다. >>하지만 다른 방법 >으로는 기존 파일의 끝에 출력을 추가 하는 것이 좋습니다 .
DerfK

바로 두 번째 명령을 막는 종료 조건을 잊어 버렸습니다.
Mike
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.