Linux 从文件中提取匹配的文本字段

Linux 从文件中提取匹配的文本字段

我有一个包含多行格式的文件:

bc("STG1/Phone") = {type=bana_pub; cbb=12.354; abb=0.0}`

我正在寻找提取cbb=12.354;。目前,我正在执行以下操作:

cat input_file.txt | grep cbb | awk -F " " '{ print $4 }'`

问题是我的方法是地点具体来说,即假设它始终是第 4 个字段。我如何提取表格中的文本,cbb=知道后面的=长度可以是任意长度,并且分号;是可选的。我唯一的保证是,cbb=12.354;如果有帮助的话,该术语将被空格包围。将来的文件可能采用以下格式:

bc("STG1/Phone") = {type=bana_pub; cbb=12.354; abb=0.0}
bc("STG1/Phone") = {type=bana_pub;  abb=0.0; cbb=12.354}

我的直觉告诉我正则表达式可能是可行的方法,但如果可以的话,我通常会尝试避免它,因为我更喜欢简单的匹配工具(我更了解它)。

非常感谢您的帮助。

答案1

解决方案:

grep -Eo 'cbb=[^;}]+'

我们来测试一下:

$ grep -Eo 'cbb=[^;}]+' <<<'bc("STG1/Phone") = {type=bana_pub; cbb=12.354; abb=0.0}`'
$ cbb=12.354

解释:

使用时,... | grep cbb | ...您使用的是基本正则表达式。高级正则表达式并不那么复杂。

该选项-E用于高级正则表达式,对于不转义某些元字符很有用。-o用于打印 grep 匹配的内容而不是整行。

正则表达式cbb=[^;}]+对于任何其他 cmd 都是相同的,而不仅仅是 grep。

cbb=是一个固定字符串,其中没有元字符(c后跟b等)

[^;}]+方括号在单个位置上界定字符集。开头的插入符号表示否定字符集。加号表示一个或多个字符。这样它将匹配任何字符,至少一个,直到找到一个;}

这是一个了解有关正则表达式的更多信息的良好链接: https://www.regular-expressions.info/characters.html

答案2

这是可行的并且与位置无关:

grep cbb input_file.txt | awk -F "cbb=" '{ print $2 }'| awk -F ";" '{print "cbb=" $1}'

首先,它仅选择包含的行cbb,然后使用字符串cbb=作为分隔符,最后使用;添加字符串作为字段分隔符cbb=到最终的结果。

答案3

您也可以使用 sed(因为 sed 只被调用一次,所以应该更快)

sed -n 's/^.*\(cbb=[0-9\.]*\).*$/\1/p' sample.txt

其中,sample.txt 是您的输入文件。仅检查数字 ([0-9.]) 以解决可选分号可能存在​​的问题。

答案4

在这种情况下,grep这是完成这项工作的正确工具。不过,我想补充一点:

  • Perl

    perl -lane 'print $1 if /(cbb=[^;}]+)/' input_file.txt
    
  • 大王

    awk 'match($0,/cbb=[^;}]+/,m) {print m[0]}' input_file.txt
    
  • 塞德

    sed -rn 's/.*(cbb=[^;}]+).*/\1/p' input_file.txt
    

感谢 Paulo 理解了 OP 的意思:

后面=可以是任意长度,分号;是可选的。我唯一能保证的是,该术语cbb=12.354;将被空格包围

相关内容