Linux

2 個字元串之間的 Bash 搜尋字元串

  • September 15, 2022

我需要幫助來提取字元串(索引)之間的內容。

具體來說,我正在嘗試檢查哪個索引號得到了字元串“HDMI 1”。

因為索引段落之間的索引計數和行計數是動態的,所以使用 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"

使用 grep 僅提取索引號和搜尋的名稱。名稱正上方的索引號是您想要的,因此使用 grep 的-B(之前)上下文來提取它並head刪除名稱行。

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

只需將索引儲存在變數中,然後在行匹配時列印變數HDMI。awk 將是一個不錯的選擇:

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

或 perl:

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

引用自:https://unix.stackexchange.com/questions/717422