변수에 대한 grep


58

변수가 있다고 가정 해 봅시다

line="This is where we select from a table."

이제 문장에서 몇 번이나 선택이 발생하는지 grep하고 싶습니다.

grep -ci "select" $line

나는 그것을 시도했지만 작동하지 않았다. 나는 또한 시도했다

grep -ci "select" "$line"

여전히 작동하지 않습니다. 다음과 같은 오류가 발생합니다.

grep: This is where we select from a table.: No such file or directory

1
herestring을 사용해야합니다 ...<<<"$line" . grep대신 명령 이 파일을 기대하고 있습니다
Valentin Bajrami

답변:


84

적이 grep표준 입력에서 읽을. 파이프를 사용하여 간다 ...

$ echo "$line" | grep select

... 또는 here 문자열 ...

$ grep select <<< "$line"

또한 grepping하기 전에 공백을 줄 바꿈으로 바꾸고 싶을 수도 있습니다.

$ echo "$line" | tr ' ' '\n' | grep select

... 또는 grep일치하는 내용 만 인쇄 하도록 요청할 수 있습니다.

$ echo "$line" | grep -o select

일치하는 항목이 있으면 나머지 줄을 제거 할 수 있습니다.

편집 : 죄송합니다 . Marco에게 감사 합니다. 발생 횟수를 계산하려면이 중 하나를 wc(1);)로 파이프하십시오 .

또 다른 편집 이후 lzkata 인용의 코멘트를 $line사용하는 경우 echo.


3
OP는 문자열의 발생 횟수를 계산하려고하기 때문에 wc작업을 완료 하기 위해 a 를 추가 할 수 있습니다 .grep -o <string> <<< "$variable" | wc -l
Marco

2
사용 echo "$line"하는 대신에 사람을 만드는 기존의 줄 바꿈 유지하기 위해tr
Izkata

Here String의 가용성은 무엇입니까? Bash 또는 다른 쉘이 필요합니까?

Wikipedia 에 따르면 여기에서 bash, ksh 및 zsh로 문자열을 사용할 수 있습니다 (그러나 다른 문자열이 있다고 가정합니다).
John WH Smith

7
test=$line i=0
while case "$test" in (*select*)
test=${test#*select};;(*) ! :;;
esac; do i=$(($i+1)); done

grep그런 간단한 것을 요구할 필요는 없습니다 .

또는 기능으로 :

occur() while case "$1" in (*"$2"*) set -- \
        "${1#*"$2"}" "$2" "${3:-0}" "$((${4:-0}+1))";;
        (*) return "$((${4:-0}<${3:-1}))";;esac
        do : "${_occur:+$((_occur=$4))}";done

2 개 또는 3 개의 인수가 필요합니다. 그 이상을 제공하면 결과가 왜곡됩니다. 다음과 같이 사용할 수 있습니다.

_occur=0; occur ... . 2 && echo "count: $_occur"

...의 발생 횟수 출력되는 .하여 ...이 적어도 2 회 발생한 경우. 이처럼 :

count: 3

경우 $_occur중 하나 비어 있거나 unset이 호출 될 때 그것은 전혀 쉘 변수에 영향을 미치지 것이다 return경우 1 "$2"에서 발생 "$1"보다 더 적은 "$3"시간. 또는 두 개의 인수로만 호출 return하면 "$2"에없는 경우에만 1이됩니다 "$1". 그렇지 않으면 0을 반환합니다.

따라서 가장 간단한 형태로 다음을 수행 할 수 있습니다.

occur '' . && echo yay || echo shite

... 인쇄 ...

shite

...그러나...

occur . . && echo yay || echo shite

... 인쇄 할 것이다 ...

yay

또한 약간 다르게 작성 $2하고 (*"$2"*)and "${1#*"$2"}"문 에서 따옴표를 생략 할 수도 있습니다 . 그렇게 sh[io]te하면 일치 테스트 와 같은 일치에 쉘 글롭을 사용할 수 있습니다 .


1
+1 : 실제로 더 빠릅니다. 에서 작동 bash하고 dash/ sh(그리고 아마도 다른 몇 가지).
존 WH 스미스

@JohnWHSmith-편집이 더 좋지만 여전히 휴대용입니다.
mikeserv
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.