示例输入:
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),如果第一个单词是"文件名:"或者只是第一个单词,如果它的形式是??:??。?。但这是另一个问题 - 我可以检查第一个单词是否为??:??。?不知道任何数字?能够做到这一点也基本上解决了这个问题,因为我可以解析所有的前几个字段。
答案 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}'