grep - null 값 무시

grep - null 값 무시

검색 결과 출력을 무시하는 쉬운 방법이 있는지 궁금합니다.$pacmd list-modules | grep -e 'name: <module-cli-protocol-unix>' -e 'argument: '

이 경우 출력은 인수에 값이 있는지 여부를 제공합니다.

입력 $pacmd list-modules형식 조각:

...    
index: 5#<---not this index because the module's module-cli-protocol-unix arg is empty
name: <module-cli-protocol-unix>#<---not this name though its name is module-cli-protocol-unix but still its arg is empty
argument: <>#<---not this module's arg because it is empty
used: -1
load once: yes
properties:
    module.author = ""
    module.description = ""
    module.version = "10.0"
index: 6
name: <module-switch-on-port-available>
argument: <>
used: -1
load once: no
properties:

index: 7
name: <module-udev-detect>
argument: <>
used: -1
load once: yes
properties:
    module.author = "Lennart Poettering"
    module.description = "Detect available audio hardware and load matching drivers"
    module.version = "10.0"
index: 8
name: <module-bluetooth-policy>
argument: <>
used: -1
load once: yes
properties:
    module.author = "Frédéric Dalleau, Pali Rohár"
    module.description = "Policy module to make using bluetooth devices out-of-the-box easier"
    module.version = "10.0"
index: 9 #<---this one because it is the module-cli-protocol-unix index
name: <module-cli-protocol-unix>#<---this one because its name is module-cli-protocol-unix
argument: <sink_name=module-cli_>#<---this one because module's arg is not empty
used: -1
load once: yes
properties:
    module.author = ""
    module.description = ""
    module.version = "10.0"
index: 10
name: <module-bluez5-discover>
argument: <>
used: -1
load once: yes
properties:
    module.author = "João Paulo Rechi Vita"
    module.description = "Detect available BlueZ 5 Bluetooth audio devices and load BlueZ 5 Bluetooth audio drivers"
    module.version = "10.0"
...

최종 출력으로 다음과 같은 것이 더 좋습니다.

index: N
name: <module-cli-protocol-unix> 
argument: <not-empty-value> 

정확한 입력 예에 따라 정렬된 출력은 다음과 같아야 합니다.

    index: 9
    name: <module-cli-protocol-unix> 
    argument: <sink_name=module-cli_>

...그러나 null이 아닌 매개변수가 있는 다른 모듈이 초기화되려고 하는 경우를 대비해 솔루션은 동적이어야 합니다...

그래서 내 질문은 인수에 null이 아닌 값이 있는 경우 grep 출력에 이름을 어떻게 지정합니까? 그리고 예, 비스크립팅 솔루션이 있다면 좋을 것입니다... ;).


편집하다

방금 이 솔루션을 시도했지만 pacmd list-modules | grep -B2 'argument: <[^>]' | grep -Po 'index:.*|name: <module-cli-protocol-unix>'결과는 다음과 같습니다.

index: 0
index: 1
name: <module-cli-protocol-unix>
index: 25
index: 26
name: <module-cli-protocol-unix>

...2개의 모듈에 대해 4개의 인덱스를 제공하기 때문에 이상하지만 모듈당 하나의 인덱스가 있어야 합니다. S

답변1

pacmd list-modules |\
grep -B2 'argument: <[^>]' |\
grep -B1 -A1 'name: <module-cli-protocol-unix>'
  • -B옵션은 일치 항목 자체뿐 아니라 일치 항목 앞의 줄도 인쇄합니다.
  • -A옵션은 일치 후 행을 인쇄합니다.
  • 공백이 문제인 경우 sed를 사용하여 공백을 제거할 수 있습니다.

따라서 프로세스는 다음과 같습니다.

  • 모든 모듈 나열
  • 0이 아닌 매개변수로 필터링
  • 그런 다음 올바른 모듈 이름을 필터링합니다.

답변2

몇 가지 예를 제공하기 전까지는 명확하지 않지만 다음을 시도해 볼 수 있습니다.

pacmd list-modules | grep -v 'argument: <>' | grep -e 'name: <module-cli-protocol-unix>'

먼저 null 인수가 있는 모든 문자열을 거부한 다음 name: <module-cli-protocol-unix>.

답변3

만약 당신이 argument: <>전문가가 되는 것을 고려하고 있다면비어 있는그렇다면 이것이 효과가 있을 수 있다는 주장

pacmd list-modules | grep -B2 '^argument: <..*>' | grep -E '^(index|name|argument):'

샘플 출력:

index: 9
name: <module-cli-protocol-unix>
argument: <sink_name=module-cli_>

답변4

다음 명령을 사용해 보았더니 정상적으로 작동했습니다.

주문하다

pacmd list-modules|awk '/index: [0-9]/||/name: <.*>/||/argument: <.*?>/{print $0}' 

관련 정보