1

i need help to extract content between strings (index).

Specifically I'm trying to check which indexnumber got the string "HDMI 1".

Because the Indexcount and the linecount between the index paragraph is dynamic its very hard with bash utils to get an reasonable approach for this for me.

Any advices here how can i achieve this? Would be very awesome!

Following file

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"

4 Answers 4

1

Extract just the index numbers and the searched name using grep. The index number just above the name is the one you want, so use grep's -B (before) context to extract it and head to remove the name line.

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

Just store the index in a variable, and then print the variable if the line matches HDMI. Awk would be a good choice here:

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

Or perl:

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

Using sed

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

Hold the index seen before HDMI 1 in the hold buffer, match HDMI 1, exchange the line for the contents of the hold buffer, print the index then immediately exit.

0
0

Having all occurrences of HDMI 1 listed:

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

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.