Grep 별칭 - 라인 번호(파이프라인에 없는 경우)

Grep 별칭 - 라인 번호(파이프라인에 없는 경우)

줄 번호를 추가하기 위해 grep에 대한 bash 별칭을 만들고 싶습니다.

alias grep='grep -n'

물론 이로 인해 파이프라인의 라인 수도 늘어납니다. 대부분의 경우(예외 없음) 파이프 내부에 줄 번호가 있는 것을 원하지 않으며(적어도 내부적으로는 마지막 줄이면 괜찮을 것임) sed/awk/cut 파이프를 추가하고 싶지 않습니다. 꺼내세요.

어쩌면 내 요구 사항은 "grep이 줄의 유일한 명령인 경우에만 줄 번호를 추가"하도록 단순화될 수 있습니다. 특별히 보기 흉한 별명을 요구하지 않고 이를 수행할 수 있는 방법이 있습니까?

답변1

bash(또는 모든 POSIX 셸)에서 다음과 같이 함수를 사용할 수 있습니다.

grep() { 
    if [ -t 1 ] && [ -t 0 ]; then 
        command grep -n "$@"
    else 
        command grep "$@"
    fi
}

[ -t 1 ]부분에서는 [명령을 사용합니다.(또한 ~으로 알려진 test)stdout이 tty와 연결되어 있는지 확인하십시오.

또한 다음과 같은 경우 [ -t 0 ]행 번호만 추가하도록 지정했으므로 표준 입력도 확인합니다 .grep오직파이프라인의 명령.

답변2

(완전함을 위해)

하지만@enzotib의 답변아마도 그것은 당신이 원하는 것이 아니라 당신이 원하는 것일 것입니다. [ -t 1 ]파일 설명자가 터미널 장치이고 파이프(예: 일반 파일, 소켓, 기타 장치 등 /dev/null) 이외의 것이 아닌지 확인하세요.

[명령은 파이프와 동일하지 않습니다 -t. 파일 설명자와 관련된 파일 형식을 얻으려면 fstat()시스템 호출을 수행해야 합니다. 이를 수행하는 표준 명령은 없지만 일부 시스템이나 쉘에는 일부가 있습니다.

GNU 사용 stat:

grep() {
  if { [ "$(LC_ALL=C stat -c %F - <&3)" = fifo ]; } 3>&1 ||
     [ "$(LC_ALL=C stat -c %F -)" = fifo ]; then
    command grep "$@"
  else
    command grep -n "$@"
  fi
}

또는 여기에만 로드되는 zsh자체 stat내장 함수(GNU보다 몇 년 앞서 있음)를 사용하십시오 zstat.

grep() {
  zmodload -F zsh/stat b:zstat
  local stdin_type stdout_type
  if zstat -A stdin_type -s -f 0 +mode &&
     zstat -A stdout_type -s -f 1 +mode &&
     [[ $stdin_type = p* || $stdout_type = p* ]]
  then
     command grep "$@"
  else
     command grep -n "$@"
  fi
}

이제 몇 가지 주의 사항:

단순한 껍데기가 아니다관로파이프를 사용합니다.

var=$(grep foo bar)

또는:

cmd <(grep foo bar)

또는:

coproc grep foo bar

또한 grep표준 출력을 파이프로 실행합니다.

쉘이 이면 ksh93일부 시스템에서는 파이프의 파이프 대신 소켓 쌍을 사용한다는 점에 유의하십시오.

관련 정보