두 문자열 사이의 Bash 검색 문자열

두 문자열 사이의 Bash 검색 문자열

문자열(인덱스) 사이의 콘텐츠를 추출하는 데 도움이 필요합니다.

특히 어떤 인덱스 번호에 "HDMI 1"이라는 문자열이 있는지 확인하려고 합니다.

Indexcount와 색인된 단락 사이의 줄 수는 동적이기 때문에 bash 유틸리티를 사용하여 합리적인 접근 방식을 찾는 것은 어렵습니다.

어떻게 이것을 달성할 수 있는지 제안해 주시겠습니까? 그러면 좋을 것 같아요!

2 sink(s) available.
    index: 1
        name: <alsa_output.pci-0000_00_1f.3.analog-stereo>
        driver: <module-alsa-card.c>
        flags: HARDWARE HW_MUTE_CTRL HW_VOLUME_CTRL DECIBEL_VOLUME LATENCY DYNAMIC_LATENCY
        state: SUSPENDED
        suspend cause: IDLE
        priority: 9039
        volume: front-left: 30129 /  46% / -20,25 dB,   front-right: 30129 /  46% / -20,25 dB
                balance 0,00
        base volume: 65536 / 100% / 0,00 dB
        volume steps: 65537
        muted: no
        current latency: 0,00 ms
        max request: 0 KiB
        max rewind: 0 KiB
        monitor source: 1
        sample spec: s16le 2ch 48000Hz
        channel map: front-left,front-right
                     Stereo
        used by: 0
        linked by: 0
        configured latency: 0,00 ms; range is 0,50 .. 1837,50 ms
        card: 0 <alsa_card.pci-0000_00_1f.3>
        module: 24
        properties:
                alsa.resolution_bits = "16"
                device.api = "alsa"
                device.class = "sound"
                alsa.class = "generic"
                alsa.subclass = "generic-mix"
                alsa.name = "ALC623 Analog"
                alsa.id = "ALC623 Analog"
                alsa.subdevice = "0"
                alsa.subdevice_name = "subdevice #0"
                alsa.device = "0"
                alsa.card = "0"
                alsa.card_name = "HDA Intel PCH"
                alsa.long_card_name = "HDA Intel PCH at 0x6001110000 irq 136"
                alsa.driver_name = "snd_hda_intel"
                device.bus_path = "pci-0000:00:1f.3"
                sysfs.path = "/devices/pci0000:00/0000:00:1f.3/sound/card0"
                device.bus = "pci"
                device.vendor.id = "8086"
                device.vendor.name = "Intel Corporation"
                device.product.id = "f0c8"
                device.form_factor = "internal"
                device.string = "front:0"
                device.buffering.buffer_size = "352800"
                device.buffering.fragment_size = "176400"
                device.access_mode = "mmap+timer"
                device.profile.name = "analog-stereo"
                device.profile.description = "Analog Stereo"
                device.description = "Built-in Audio Analog Stereo"
                module-udev-detect.discovered = "1"
                device.icon_name = "audio-card-pci"
        ports:
                analog-output-speaker: Speakers (priority 10000, latency offset 0 usec, available: unknown)
                        properties:
                                device.icon_name = "audio-speakers"
                analog-output-headphones: Headphones (priority 9900, latency offset 0 usec, available: no)
                        properties:
                                device.icon_name = "audio-headphones"
        active port: <analog-output-speaker>
  * index: 2
        name: <alsa_output.hw_0_7>
        driver: <module-alsa-sink.c>
        flags: HARDWARE DECIBEL_VOLUME LATENCY DYNAMIC_LATENCY
        state: RUNNING
        suspend cause: (none)
        priority: 9030
        volume: front-left: 65536 / 100% / 0,00 dB,   front-right: 65536 / 100% / 0,00 dB
                balance 0,00
        base volume: 65536 / 100% / 0,00 dB
        volume steps: 65537
        muted: no
        current latency: 40,43 ms
        max request: 7 KiB
        max rewind: 7 KiB
        monitor source: 3
        sample spec: s16le 2ch 48000Hz
        channel map: front-left,front-right
                     Stereo
        used by: 1
        linked by: 1
        configured latency: 40,00 ms; range is 0,50 .. 1837,50 ms
        module: 25
        properties:
                alsa.resolution_bits = "16"
                device.api = "alsa"
                device.class = "sound"
                alsa.class = "generic"
                alsa.subclass = "generic-mix"
                alsa.name = "HDMI 1"
                alsa.id = "HDMI 1"
                alsa.subdevice = "0"
                alsa.subdevice_name = "subdevice #0"
                alsa.device = "7"
                alsa.card = "0"
                alsa.card_name = "HDA Intel PCH"
                alsa.long_card_name = "HDA Intel PCH at 0x6001110000 irq 136"
                alsa.driver_name = "snd_hda_intel"
                device.bus_path = "pci-0000:00:1f.3"
                sysfs.path = "/devices/pci0000:00/0000:00:1f.3/sound/card0"
                device.bus = "pci"
                device.vendor.id = "8086"
                device.vendor.name = "Intel Corporation"
                device.product.id = "f0c8"
                device.form_factor = "internal"
                device.string = "hw:0,7"
                device.buffering.buffer_size = "352800"
                device.buffering.fragment_size = "176400"
                device.access_mode = "mmap+timer"
                device.description = "Built-in Audio"
                device.icon_name = "audio-card-pci"

답변1

grep을 사용하여 인덱스 번호와 검색 이름만 추출합니다. 이름 위의 인덱스 번호는 원하는 인덱스 번호이므로 grep의 -B(이전) 컨텍스트를 사용하여 추출하고 head이름 행을 제거하십시오.

grep 'index:\|name = "HDMI 1"' file | grep -B1 'HDMI 1' | head -n1

답변2

인덱스를 변수에 저장한 다음 행이 일치하면 해당 변수를 인쇄합니다 HDMI. 여기서 awk는 좋은 선택입니다.

$ awk '{ if (/index:/) {ind=$NF} if(/HDMI/){print ind,$0}}' file
2                 alsa.name = "HDMI 1"
2                 alsa.id = "HDMI 1"

또는 펄:

$ perl -ne '$ind=$1 if /index:\s*(\d+)/; if(/HDMI/){print "$ind $_"}' file
2                 alsa.name = "HDMI 1"
2                 alsa.id = "HDMI 1"

답변3

사용sed

$ sed -En '/index/{h;};/HDMI 1/{x;p;q;}' input_file
  * index: 2

이전에 본 인덱스를 HDMI 1보유 버퍼에 저장하고 match하고 HDMI 1행을 보유 버퍼의 내용으로 바꾸고 인덱스를 인쇄한 다음 즉시 종료합니다.

답변4

모든 발생을 나열합니다 HDMI 1.

$ sed -En '/index/{h;};/HDMI 1/{G;s/\n//;p;}' infile
                alsa.name = "HDMI 1"  * index: 2
                alsa.id = "HDMI 1"  * index: 2

관련 정보