이전 답변을 기반으로 한 새로운 명령

이전 답변을 기반으로 한 새로운 명령

grep단일 기준을 사용하여 순서에 관계없이 여러 패턴과 일치하는 항목을 검색 할 수 있는 방법이 있습니까 ?

그림에서 알 수 있듯이여러 AND 패턴으로 grep을 실행하는 방법은 무엇입니까?여러 모드의 경우 사용할 수 있습니다

grep -e 'foo.*bar' -e 'bar.*foo'

그런데 여기서는 2개의 조건을 써야 하고, 3개의 패턴에 6개의 조건을 써야 하는 식으로... 가능하다면 단일 조건을 쓰고 싶습니다. 어떤 순서로든 패턴을 찾으려면 다음을 사용하여 제안할 수 있습니다.

grep -e 'foo' | grep -e 'bar' # at least i do not retype patterns here

이것은 작동하지만 컬러 출력을 보고 싶습니다. 이 경우에만술집강조 표시됩니다.

제가 쓰고 싶은 조건은 아주 간단해요

awk '/foo/ && /bar/'

가능하다면 grep(awk는 결과를 강조하지 않으므로 쉽게 수행할 수 있을지 의문입니다).

agrep어쩌면 내가 원하는 것을 할 수 있을지 모르지만 우분투 12.04의 기본 grep(2.10-1)이 이것을 할 수 있는지 알고 싶습니다.

답변1

귀하의 버전이 PCRE를 지원하는 경우 grep(GNU는 또는 옵션을 grep사용 하여 이를 수행함 ), 미리보기를 사용하여 순서에 상관없이 여러 단어를 일치시킬 수 있습니다.-P--perl-regexp

grep -P '(?=.*?word1)(?=.*?word2)(?=.*?word3)^.*$'

그러나 이것은 단어를 강조하지 않습니다. 미리보기는 일치하는 시퀀스의 일부가 아닌 길이가 0인 어설션입니다.

귀하의 파이프 솔루션이 여기서 작동해야한다고 생각합니다. 기본적으로 grep출력은 터미널에 도달할 때만 색상이 지정되므로 파이프라인의 마지막 명령만 강조 표시되지만 를 사용할 수 있습니다 --color=always.

grep --color=always foo | grep --color=always bar

답변2

이전 답변을 기반으로 한 새로운 명령

#!/bin/bash
# Build search pipeline
n=$#
SEARCH=""
while [ $n -gt 0 ]; do
    if [ -n "$SEARCH" ]; then
            SEARCH="|${SEARCH}"
    fi
    SEARCH="grep --color=always '${!n}'${SEARCH}"
    n=$[ $n - 1 ]
done
# Execute all greps in sequence
/bin/bash -c "${SEARCH}"

따라서 요청한 대로:

제가 쓰고 싶은 조건은 아주 간단해요awk '/foo/ && /bar/'

yagrep SEARCH grep color < /usr/local/bin/yagrep

찾다= =grep--색상=항상 '${!n}'${찾다}"

오래된 답변

정교한 옵션은 패턴의 모든 순열을 생성하고 이를 grep정규식 컴파일러에 제공하고 합리적으로 최적화된 검색 트리를 생성하는 것입니다.

하지만 패턴 수가 6개라고 해도 순열은 6개가 됩니다! 또는 720. 이로 인해 명령줄이 어색해질 수 있습니다.

grep하지만 파이프라인 외에 다른 문제는 없는 것 같습니다.

이것은 작동하지만 컬러 출력을 보고 싶습니다.

그 다음에,전제는:

  • 패턴이 겹치지 않습니다
  • 패턴에 용어 제어 문자가 포함되어 있지 않습니다.

허용 가능한 솔루션은 grep가능성이 높아지는 순서대로 각각 패턴이 있는 여러 s를 파이프하여 로드를 최소화하는 것입니다.

그런 다음 색상이 제대로 작동하는지 확인하려면 grep강제 로표준 출력이 터미널이라고 믿으세요또는 다른 방법을 사용하거나 faketerm사용 가능한 경우(있어야 하는 경우) 다음 --color=always옵션을 사용할 수 있습니다.

cat file | grep --color=always pattern1 \
         | grep --color=always pattern2 \
         ...
         | grep --color=always patternN 

(좋은 방법은 grep서브쉘에 의한 실행을 위해 s를 단일 문자열로 래핑하고 예를 들어 프로그래밍 방식으로 문자열을 생성하는 것입니다 sed.)

답변3

다음을 사용하여 출력에 색상을 지정할 수 있습니다.sed

sed -n "/foo/{/bar/s/foo\|bar/\x1b[1;31m&\x1b[m/gp}"

답변4

단일 OR 기반 정규식을 사용하여 이 작업을 수행할 수 있습니다. 주어진 파일 내용:

This is my file
It has many words
There are also many chars

다음 grep 명령은 단일 매개변수에서 "my" 및 "There"를 강조 표시합니다.

grep -P -e '(there|my)' testfile

|OR을 나타내려면 각 정규식 패턴을 (파이프)로 구분하기 만 하면 됩니다 .

관련 정보