여러 grep의 대안

여러 grep의 대안

쉘 스크립트에서 파이프라인 출력 목록을 읽고 특정 항목을 찾고 있습니다. 정확한 이름은 모르지만, 그 안에 있는 단어는 알고 있어요. 그것을 찾기 위해 항목에 나타날 것으로 알고 있는 각 단어에 대해 여러 grep을 사용합니다.

pw-cli list-objects | grep node.name | grep output | grep pci | grep analog

이를 수행하기 위한 다른 옵션이 있습니까? 감사해요.

답변1

나는 이것을 위해 awk를 사용할 것입니다:

pw-cli list-objects | awk '/node\.name/ && /output/ && /pci/ && /analog/'

또는 Perl의 정규식 구문이나 기타 Perl 언어 기능 또는 라이브러리 모듈이 필요한 경우 Perl을 사용할 수도 있습니다(이 예에서는 실제로 필요하지 않음).

pw-cli list-objects | 
  perl -n -e 'print if (/node\.name/ && /output/ && /pci/ && /analog/)'

이를 위해 awk 또는 Perl을 사용하면 두 가지 주요 이점이 있습니다.

  1. 입력 단어의 순서에 관계없이 입력 줄과 일치합니다. 즉, node\.name.*output.*pci.*analog이와 같은 정규 표현식은 해당 단어가 입력 줄에 있는 경우에만 일치합니다.정확히그 주문. 위의 awk 또는 perl 한 줄 문은 4개의 단어가 모두 어떤 순서로든 입력 줄에 나타나면 일치합니다. 이는 grep파이프라인에서 여러 s를 함께 연결하는 방법과 동일합니다.

    할 수 있다각 위치 변경에 대해 replacement() 와 함께 확장 정규식을 사용 |하지만 4개 단어의 경우 가능한 모든 순열을 일치시키려면 16개의 대체 버전이 필요하므로 이는 비실용적입니다.(a.*b.*c.*d)|(a.*c.*b.*d)|(a.*b.*d.*c)|.........

  2. &&||(AND), (OR), (부정) 및 괄호의 조합을 사용하여 !임의로 복잡한 부울 조건을 구성 할 수 있습니다 . 또한 true 또는 false 결과를 반환하는 다른 awk 또는 perl 구문과 함께 사용할 수도 있습니다(예: 입력 줄의 필드를 기반으로 한 계산 및 비교).

답변2

예, "정규식"을 사용하면 됩니다. 읽다 man grep.

# if they're on the same linr
pw-cli | grep 'node\.name.*output.*pci.*analog'
# or if they're not
pw-cli | grep 'node\.name|output<pci|analog'

관련 정보