如何通过换行符或字符读取输入?

时间:2015-12-15 17:43:34

标签: linux bash unix awk

示例输入:

Filename: 1-1.3
Organization: Bus 1 => Port 1 => Subport 3 => Device 4
Classes: Audio Video
Drivers: snd-usb-audio uvcvideo

00:03.0 Audio device: Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor HD Audio Controller (rev 06)
    Subsystem: Gigabyte Technology Co., Ltd Device 5000
    Kernel driver in use: snd_hda_intel
--
00:1b.0 Audio device: Intel Corporation 8 Series/C220 Series Chipset High Definition Audio Controller (rev 05)
    Subsystem: Gigabyte Technology Co., Ltd Device fa60
    Kernel driver in use: snd_hda_intel

我想以某种方式操纵这个回归:

1-1.3
00:03.0
00:1b:0

我以为我可以按行阅读并检查\ n或 - ,然后硬编码第二个字段(awk),如果第一个单词是"文件名:"或者只是第一个单词,如果它的形式是??:??。?。但这是另一个问题 - 我可以检查第一个单词是否为??:??。?不知道任何数字?能够做到这一点也基本上解决了这个问题,因为我可以解析所有的前几个字段。

1 个答案:

答案 0 :(得分:2)

你可以完全按照你在awk中描述的那样做:

awk -F" " '$1 == "Filename:"{print $2}
           $1 ~ /[[:alnum:]]{2}:[[:alnum:]]{2}.[[:alnum:]]/{print $1}' test

第一行检查第一个字段是否等于Filename:。如果是这样,我们打印第二个字段 第二行检查第一个字段是否匹配模式" 2个字母数字字符后跟:后跟2个字母数字字符,后跟.后跟一个字母数字字符"。在这种情况下,awk打印此模式 提供的示例的输出是(根据要求):

1-1.3
00:03.0
00:1b.0

请注意,SO不是编码服务,您最好自己尝试。

<强>更新
根据anishsane(见评论),模式匹配甚至有更好的正则表达式。通过将[:alnum:]替换为[:xdigit:],可以匹配十六进制数字的字符:

awk -F" " '$1 == "Filename:"{print $2}
           $1 ~ /[[:xdigit:]]{2}:[[:xdigit:]]{2}.[[:digit:]]/{print $1}'