질문 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."}'

또는 다음에서 모든 작업을 수행합니다 awk(이렇게 하면 GNUism도 피할 수 있습니다 -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 문자로 제한됩니다. 또는 (일부 ) 접근 방식 -Mopen=locale과 같이 로케일에 따라 알파벳 문자의 문자를 포함하려면 a를 추가하세요.)grepawkawk

bash귀하의 질문 2에 대해서는 (와는 달리 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
    

관련 정보