cat 명령은 파일을 반환합니까, 아니면 파일의 내용을 반환합니까?

cat 명령은 파일을 반환합니까, 아니면 파일의 내용을 반환합니까?

다음 명령을 비교해보세요:

cat f.txt | grep "someText" 
grep "someText" f.txt

그들은 모두 작동하는 것 같습니다. 그러나 cat에 대한 문서에 따르면 cat은 파일 이름 대신 파일 내용을 출력하고 grep 명령은 파일 내용 대신 파일 이름을 사용합니다(틀렸다면 정정해 주세요). 그러면 첫 번째 명령은 왜 수행됩니까? grep 파일 이름 대신 파일 내용을 제공하기 때문에 작동합니다.

또 다른 질문: 둘 다 작동하지만 왜 두 번째 대신 첫 번째 줄을 사용합니까? 첫 번째 줄은 중복됩니까?

답변1

첫 번째 예에서

cat f.txt | grep "someText" 

grep가져올 파일 이름 매개변수는 없으며 검색할 문자열만 있습니다. 이 경우 grep검색할 텍스트를 표준 입력에서 읽습니다. 이 경우 표준 입력은 의 출력에서 ​​파이프됩니다 cat f.txt.출력 파일의 내용파일 이름이 아닙니다. 다음을 수행하여 표준 입력에서 데이터를 읽을
수도 있습니다 .grep

< f.txt grep "someText"

그 자체를 사용하는 cat것은 일반적으로 중복되며( 와 무관 grep) 위의 입력 리디렉션으로 대체될 수 있습니다. 입력을 전처리해야 하는 경우를 제외하고는 항상 예제에서 두 번째 형식을 사용합니다.

답변2

cat첫 번째 예에서와 같이 사용하는 두 가지 주요 이유는 다음과 같습니다.

  1. 다른 명령이나 길고 복잡한 명령 파이프라인에 대한 자리 표시자 역할을 합니다.

    psql예를 들어, 대용량 파일이나 / mysql또는 wget또는 같은 쿼리의 데이터를 처리하기 위해 스크립트나 한 줄짜리 코드를 작성하는 경우 jq입력(일부)을 샘플 파일에 저장하고 다음 결과를 cat sample얻을 때까지 입력 으로 사용할 수 있습니다. 스크립트 또는 한 줄짜리 권리입니다. 그런 다음 cat실제 명령이나 파이프로 바꾸십시오 .

    마찬가지로, 누군가에게 배관에 대해 가르치는 것이 목적이라면 이는 유용한 자리 표시자입니다.

    (많은 사람들이 이것을 Cat이나 UUOC의 쓸데없는 사용이라고 부릅니다. 이는 주로 그들이 잘난 척하고 초보자를 배우기보다는 소위 우수한 지식으로 때리는 것을 즐기기 때문입니다. cat학습을 돕기보다는 사용하는 끔찍한 범죄가 <너무 중요합니다. 마치 하찮은 세부 사항에 불과하고 세상이 곧 종말을 맞이하고 재앙이 될 것처럼 무시할 수 없습니다 cat.)

  2. 프로그램이 입력 파일의 파일 이름을 알기를 원하지 않을 때. 예 cat * | grep ...를 들어 grep ... *.

    이는 일반적으로 중요하지 않지만, 그런 일이 발생하면 매우 중요할 수 있습니다.

    의 경우 grep파일 이름 목록 표시 안 함을 사용할 수 있지만 -h다른 프로그램에는 이러한 옵션이 없습니다. wc예를 들어, 필요하지 않더라도 각 파일의 파일 이름과 개수는 항상 출력됩니다.

    물론, 그런 것을 사용할 수 있지만, 그런 일을 하고 결과 파일 이름 목록이 쉘의 최대 명령줄 길이를 초과하는 경우에는 작동하지 않습니다. wc * | tail -1 | awk '{print $1, $2, $3}'이 경우 여러 개의 "총" 행을 얻게 됩니다. (실제 총 행과 출력에서 ​​"total"이라는 파일을 구별할 방법이 없습니다).find . -type f -exec wc {} +findwc

    find . -type f -exec cat {} + | wcfind발견된 파일 수(없음, 하나 이상)에 관계없이 한 줄의 출력(전체)만 생성됩니다.

    ( 및 옵션이 wc모두 필요합니다 .)--totals-only--no-totals

관련 정보