
질문 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}'
(이 경우 는 \w
ASCII 문자로 제한됩니다. 또는 (일부 ) 접근 방식 -Mopen=locale
과 같이 로케일에 따라 알파벳 문자의 문자를 포함하려면 a를 추가하세요.)grep
awk
awk
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
다음을 사용하여 프롬프트를 무음으로 설정할 수 있습니다 .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