로그 파일의 압축을 풀고 awk를 사용하여 해당 로그 파일의 일부 특정 열을 표시해야 합니다. 파이프를 사용하여 이 작업을 수행할 수 있습니까?
unzip log.zip | awk -F "- -" '{pring $1 " " $2} >newfile
답변1
unzip
.zip 파일의 내용을 stdout으로 압축 해제하려면 의 옵션을 사용해야 합니다 -c
. 그렇지 않으면 .zip 파일의 파일을 디스크에 압축 해제하고 파이프할 항목이 없습니다 awk
.
Unix가 아닌 MS-DOS/Windows에서 시작된 많은 프로그램과 마찬가지로 unzip
이 프로그램도 수행하는 작업에 대해 설명이 깁니다. Unix 프로그램은 일반적으로 또는 -v
옵션 이나 유사한 옵션을 사용하여 명시적으로 지시하지 않는 한 이 작업을 수행하지 않습니다 . 이는 dos/windows와 unix 소프트웨어 사이의 중요한 문화적 차이입니다. 그리고 프로그래머.--verbose
--debug
stdin에서 입력을 받는 모든 프로그램의 POV에서 보면 이는 난독화되는 쓰레기임이 거의 확실합니다(이것이 UNIX 프로그램이 사용자가 지시하지 않는 한 장황하지 않은 이유입니다). 따라서 (조용함) 또는 (매우 조용함) 옵션을 사용하여 unzip
"Shut up and get to work(닥치고 일 시작하세요)"라고 말하세요.-q
-qq
예를 들어
unzip -qq -c log.zip | awk -F'- -' '{print $1, $2}' >newfile
그런데 awk
스크립트를 약간 변경했습니다. pring
구문 오류를 수정했습니다 . 또한 기본 출력 필드 구분 기호( OFS
) awk
는 공백입니다. 입력 필드 구분 기호( FS
)를 다른 것으로 설정하더라도(예 -F'- -'
: 그래서 그냥 인쇄합니다 $1,$2
. 큰따옴표 공백 문자를 사용할 필요가 없습니다.
답변2
다음을 수행할 수 있습니다.
awk -F "--" '{print $1 " "$2}' <(gzip -dc log.zip)
gzip 명령 사용 -d
및 -c
옵션.
-c --stdout --to-stdout
Write output on standard output
-d --decompress --uncompress
Decompress.
물론 표준 리디렉션을 사용하여 출력을 파일로 보낼 수 있습니다.
awk -F "--" '{print $1 " "$2}' <(gzip -dc log.zip) > my_out_file
Cas가 주석에서 지적했듯이 gzip은 대부분의 .zip 파일에서 작동하지만 unzip
이 명령과 함께 사용할 수 있는 모든 파일에서 작동한다는 보장은 없습니다.
awk -F "--" '{print $1 " "$2}' <(unzip -cq log.zip) > my_out_file
옵션은 약간 다르지만 결과는 동일합니다.