긴 이야기 짧게

긴 이야기 짧게

최근 grep에서 이 메시지를 발견했습니다.

"grep: warning: GREP_OPTIONS is deprecated; please use an alias or script"

내 .bashrc 파일에 --color=always가 정의되어 있기 때문에 이 경고가 표시됩니다. AFAIK 앨리어싱은 파이프에서 작동하기를 원하므로 비실용적입니다. 예를 들어,

echo "a b c" |grep b

b를 강조 표시해야 합니다. 별칭은 작동하지 않으므로 제공되는 또 다른 옵션은 스크립트를 만드는 것입니다. 하지만 스크립트가 파이프의 입력을 받아들이도록 하려면 어떻게 해야 할까요? 이 경우 스크립트에 --color=always를 추가하고 싶습니다.

편집: 별칭은 스크립팅과 마찬가지로 작동합니다. 별칭 방법에 내가 뭘 잘못하고 있는지 모르겠습니다. 단, 스크립트 작성 시 반드시 $1을 입력 매개변수로 포함시켜야 합니다.

자신의 스크립트로 파이프하는 방법을 궁금해하는 사람을 위해 이 예에서는 다음을 수행하여 나에게 도움이 되었습니다.

먼저 스크립트를 실행 가능하게 만들 경로 어딘가에 배치합니다.

# ~/.bin/testgrep
grep --color=always $1

이제 스크립트를 다음과 같이 실행 가능하게 만드십시오.

chmod +x ~/.bin/testgrep

이제 작동할 것입니다!

답변1

별칭이 작동합니다. 내 grep별칭은 다음과 같습니다 grep --color=auto.

% which grep
grep: aliased to grep --color=auto

grep에 대한 파이프에는 원하는 동작이 있습니다.

여기에 이미지 설명을 입력하세요.

답변2

grep(예: /bin/grep) 파일 이름 인수 없이 호출하면 표준 입력을 읽습니다. 따라서 grep표준 입력의 입력으로 실행되는 스크립트를 작성하는 것은 간단합니다. grep파일 이름 인수 없이 호출하면 됩니다. 하지만 grep(적어도) 하나는 주어야 합니다.무늬인수(또는 이에 상응하는 것). 극도로 융통성이 없는 접근 방식은 검색 문자열(패턴)을 grep 스크립트에 하드코딩하는 것인데, 이는 실제 생활에서는 별로 유용하지 않을 것입니다.

#!/bin/sh
grep --color=always cat

맥락에서 사용될 수 있다

ps | mygrep

그 외에는 별로 없을 수도 있습니다. ㅏ약간보다 유연한 스크립트는 환경 변수를 검색 문자열로 사용할 수 있습니다.

#!/bin/sh
grep --color=always $USER

맥락에서 사용될 수 있다

ps -ef | mygrep

그 외에는 별로 없을 수도 있습니다. 합리적이고 현실적이며 신뢰할 수 있는 유일한 솔루션은 스크립트 사용자가 검색 문자열을 명령줄 인수로 제공하도록 허용하는 것입니다.

#!/bin/sh
grep --color=always $1

맥락에서 사용될 수 있다

dmesg | mygrep TCP

그리고 실제로 꽤 유용할 수도 있습니다.

글쎄, 어쩌면 내가 말해야 할 것 같아일부효과가있다. 검색 매개변수를 지정하려면 여러 인수가 필요할 수 있으므로 이는 빠르게 분석될 수 있습니다.

mygrep -i TCP                   대소문자를 구분하지 않고 검색합니다.전송 제어 프로토콜,전송 제어 프로토콜,TCP, 등.
mygrep -v 배쉬                  모든 것을 찾아라와는 별개로세게 때리다.
mygrep -e 고양이 -e 개            다음을 포함하는 모든 줄 찾기고양이또는.
mygrep -f 단어 목록              검색 문자열이 파일에 있습니다.

따라서 스크립트의 두 번째 초안은 다음과 같습니다.

#!/bin/sh
grep --color=always $1 $2 $3 $4 $5 $6 $7 $8 $9

위의 예제 중 하나를 처리할 수 있습니다. 추가 보너스로 표준 입력을 읽는 데 사용할 필요가 없습니다.

mygrep -i path .bashrc

그것은 실행될 것이다

grep --color=always -i path .bashrc

하지만 아직 끝나지 않았습니다! 고려하다

mygrep  "cat food"  "shopping list.txt"

달릴 것이다

grep --color=always cat food shopping list.txt

, 및 cat3개의 파일에서 검색을 시도합니다 . 좋아요, 이렇게 할 수 있습니다.foodshoppinglist.txt

#!/bin/sh
grep --color=always "$1" "$2"

하지만

#!/bin/sh
grep --color=always "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9"

좋은 대답은 아닙니다.

mygrep  "cat food"  "shopping list.txt"

입력하다

grep --color=always  "cat food"  "shopping list.txt"  ""  ""  ""  ""  ""  "" ""

원하는 대로 작동하지만 7개의 오류 메시지도 표시됩니다.

그렇다면 무엇을 해야 할까요, 무엇을 해야 할까요? 잠깐만요, 내 옷장에 큰 망치가 있어요.

#!/bin/sh
if [ "$1" = "" ]
then
    printf "%s\n" "error: mygrep must be run with at least one argument."
elif [ "$2" = "" ]
then
    grep --color=always "$1"
elif [ "$3" = "" ]
then
    grep --color=always "$1" "$2"
elif [ "$4" = "" ]
then
    grep --color=always "$1" "$2" "$3"
elif [ "$5" = "" ]
then
    grep --color=always "$1" "$2" "$3" "$4"
elif [ "$6" = "" ]
then
    grep --color=always "$1" "$2" "$3" "$4" "$5"
elif [ "$7" = "" ]
then
    grep --color=always "$1" "$2" "$3" "$4" "$5" "$6"
elif [ "$8" = "" ]
then
    grep --color=always "$1" "$2" "$3" "$4" "$5" "$6" "$7"
elif [ "$9" = "" ]
then
    grep --color=always "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8"
else
    grep --color=always "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9"
fi

옳은.

  1. 이것은 터무니없이 비현실적입니다.
  2. 이것마저도 실패

    mygrep  -e cat  -e dog  -e fish  file1  file2  file3  file4
    

    9개 이상의 매개변수가 있기 때문입니다! 그리고 이 시나리오는 가능성이 낮아 보이지만 동일한 문제가 발생할 수 있습니다.

    mygrep  bird  *
    

    현재 디렉터리에 8개 이상의(숨겨지지 않은) 파일이 있는 경우.

그렇다면 무엇을 해야 할까요, 무엇을 해야 할까요?

긴 이야기 짧게

당신이 들여다 보면큰 타격(1) 아래에특수 매개변수$@, 1부터 시작하는 위치 매개변수 목록으로 확장되는 것을 볼 수 있습니다 . 큰따옴표 내에서 확장이 발생하면 각 인수가 별도의 단어로 확장됩니다. 즉, ... "$@"와 동일합니다 "$1""$2"(위의 긴 스크립트에서 구현되었지만 처음 9개로 제한되지 않음). 따라서 일부 명령(별칭과 마찬가지로)을 래핑(즉, 프런트엔드 역할)하는 스크립트를 작성하는 방법은 다음과 같습니다.

#!/bin/sh
grep --color=always "$@"

관련 정보