질문 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}'
(이 경우 \w
ASCII 문자로 제한됩니다. 또는 (some ) 메소드 에서 -Mopen=locale
와 같이 로케일에 따라 문자 스크립트에 문자를 포함하려면 a를 추가하세요. )grep
awk
awk
귀하의 질문 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
다음을 사용하여 프롬프트를 음소거할 수 있습니다.unset
shopt
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"
일반적인 답변:
단일 인스턴스를 완료할 수 없습니다
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
병렬 프로세스를 통해,즉
tee >(echo -e "\n`wc -l` matched.")
어떤 프로세스가 먼저 완료될지는 보장할 수 없습니다. 때로는 주문을 확보하기 위해 약간의 지연이 추가될 수 있습니다.
병렬 인쇄"부자"먼저"동전"1초 지연 후:
echo foo | tee >(sleep 1s; rev)
병렬 인쇄"동전"먼저"부자"1초 지연 후:
echo foo | tee >(rev) >(sleep 1s;cat) > /dev/null