단일 명령으로 텍스트 파일 및 압축 텍스트 파일 처리

단일 명령으로 텍스트 파일 및 압축 텍스트 파일 처리

다음 파일 형식을 처리하는 사용 사례가 있습니다.

1 - mylog_1.log
2 - mylog_2.log.gz

다음과 같이 각 명령에 대해 두 가지 다른 텍스트 처리 명령을 실행해야 합니다.

cat mylog_1.log | grep text | sort | uniq -c
zcat mylog_2.log.gz | grep text | sort | uniq -c

(cat, grep, awk 및 sed는 일반적인 명령입니다)

파일의 압축을 풀지 않고 단일 명령으로 두 파일 형식을 모두 처리할 수 있는 방법이 있습니까?

답변1

(cat mylog_1.log;zcat mylog_2.log.gz) | grep text | sort | uniq -c

답변2

zgrep주어진 파일의 압축을 풀고,필요하다면, 결과를 다음으로 전달합니다 grep.

$ echo text one > log_1.log
$ echo text two > log_2.log
$ gzip log_2.log
$ zgrep text log_* | sort | uniq -c
  1 log_1.log:text one
  1 log_2.log.gz:text two

답변3

단일 명령으로 텍스트 파일과 압축된 텍스트 파일을 처리하는 방법에 대한 질문이 구체적으로 있는 경우 이 다른 질문을 참조하세요. 그러나 귀하의 질문이 일반적으로 다양한 도구를 사용하여 다양한 유형의 파일에서 텍스트를 추출한 다음 동일한 방식으로 처리하는 방법에 관한 것이라면,

for file in mylog_1.log mylog_2.log.gz …
do
    if [[ "$file" == *.gz ]]
    then
        zcat "$file"
    else
        cat "$file"
    fi | grep text | sort | uniq -c
done

그러면 각 파일이 개별적으로 처리됩니다. 이를 결합(연결)하고 집계된 텍스트를 하나의 엔터티로 처리하려면 파이프를 이동하기만 하면 됩니다.

for file in mylog_1.log mylog_2.log.gz …
do
    if [[ "$file" == *.gz ]]
    then
        zcat "$file"
    else
        cat "$file"
    fi
done | grep text | sort | uniq -c

관련 정보