질문 1

질문 1

질문 1

나는 사용할 수 있다

grep -o '^[[:alpha:]_]\+[[:blank:]]*([[:blank:]]*)' /etc/rc.d/init.d/functions

다음 출력을 얻습니다.

systemctl_redirect ()
checkpid()
__kill_pids_term_kill_checkpids()
__kill_pids_term_kill()
__pids_var_run()
__pids_pidof()
daemon()
killproc()
pidfileofproc()
pidofproc()
status()
echo_success()
echo_failure()
echo_passed()
echo_warning()
update_boot_stage()
success()
failure()
passed()
warning()
action()
strstr()
is_ignored_file()
is_true()
is_false()
apply_sysctl()

그리고 몇 번이나 일치했는지도 알고 싶어서 -c옵션을 사용했는데 이번에는 을 얻으면 26일치한 항목과 개수를 비교할 수 있습니다.grep 내장옵션? 그렇지 않다면 어떨까요?

질문 2

질문 1에 대한 답변을 Github에서 찾았습니다.

grep -o '^[[:alpha:]_]\+[[:blank:]]*([[:blank:]]*)' /etc/rc.d/init.d/functions \
| tee >(echo -e "\n`wc -l` matched.")

그러나 출력은 종종 매우 이상합니다. 새 이후의 출력입니다.쉘 프롬프트!왜?

새 쉘 프롬프트 후 출력

답변1

언제든지 다음과 같이 할 수 있습니다.

grep -o ... | awk '{print};END{if (NR) print "\n" NR " matched."}'

또는 모든 작업을 수행하려면 다음 을 수행하십시오(GNUisms를 사용하여 awk이를 피할 수도 있음 ).-o\+

awk 'match($0, /^[[:alpha:]_]+[[:blank:]]*\([[:blank:]]*\)/) {
       print substr($0, RSTART, RLENGTH)
       n++
     }
     END{if (n) print "\n" n " matched.")'

또는 perl:

perl -lne 'for (/^\w+\h*\(\h*\)/g) {print; $n++}
           END {print "\n$n matched." if $n}'

(이 경우 \wASCII 문자로 제한됩니다. 또는 (some ) 메소드 에서 -Mopen=locale와 같이 로케일에 따라 문자 스크립트에 문자를 포함하려면 a를 추가하세요. )grepawkawk

귀하의 질문 2 와 관련하여 프로세스 교체에서 시작된 명령이 대기되지 않아 이러한 문제가 발생하기 때문입니다 bash. zsh바라보다프로세스 교체 출력이 고장났습니다.자세한 내용은.

답변2

tee같은 도구를 사용하는 대신pee:

grep -o '^[[:alpha:]_]\+[[:blank:]]*([[:blank:]]*)' /etc/rc.d/init.d/functions | 
pee cat 'sleep 1; echo -e "\n`wc -l` matched."'

pee사용할 수 없는 경우 별도의 셸을 사용하고 및 bash다음을 사용하여 프롬프트를 음소거할 수 있습니다.unsetshopt

bash -c \
    "unset PS0 PS1 PS2 PS3
     shopt -u promptvars
     grep -o '^[[:alpha:]_]\+[[:blank:]]*([[:blank:]]*)' \
          /etc/rc.d/init.d/functions |
     tee >( sleep 1s; printf '\n%s matched.' `wc -l`; )
     sleep 2s"

일반적인 답변:

  1. 단일 인스턴스를 완료할 수 없습니다 grep.

    행당 일치 항목이 여러 개 있을 때 전체 개수를 얻으려면 다음을 grep -o사용하세요 wc -l.

    printf "foo bar baz\nbuz biz\n" | grep -o 'b[^ ]*' | wc -l
    

    산출:

    4
    

    접두사 계산이 필요한 경우 , nl(또는 cat -n)를 사용하십시오.

    printf "foo bar baz\nbuz biz\n" | grep -o 'b[^ ]*' | nl
    

    산출:

         1  bar
         2  baz
         3  buz
         4  biz
    
  2. 병렬 프로세스를 통해,

    tee >(echo -e "\n`wc -l` matched.")
    

    어떤 프로세스가 먼저 완료될지는 보장할 수 없습니다. 때로는 주문을 확보하기 위해 약간의 지연이 추가될 수 있습니다.

    병렬 인쇄"부자"먼저"동전"1초 지연 후:

    echo foo | tee >(sleep 1s; rev)
    

    병렬 인쇄"동전"먼저"부자"1초 지연 후:

    echo foo | tee >(rev) >(sleep 1s;cat) > /dev/null
    

관련 정보