Linux
2 個字元串之間的 Bash 搜尋字元串
我需要幫助來提取字元串(索引)之間的內容。
具體來說,我正在嘗試檢查哪個索引號得到了字元串“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"