使用awk从一行中提取值

时间:2014-08-07 05:49:41

标签: bash awk sed

我在文件中有这两行:

<first-value system-property="unique.setting.limit">3</first-value>
<second-value-limit>50000</second-value-limit>

我希望使用awk或sed获取以下内容:

3    
50000

使用此sed命令无法正常工作,我怀疑这是由于我的行条目中存在引号和分隔符。

sed -n '/WORD1/,/WORD2/p' /path/to/file

如何从文件中提取我想要的值?

6 个答案:

答案 0 :(得分:5)

awk -F'[<>]' '{print $3}' input.txt

input.txt中:

<first-value system-property="unique.setting.limit">3</first-value>
<second-value-limit>50000</second-value-limit>

输出:

3
50000

答案 1 :(得分:1)

对我来说看起来像XML,所以假设它是某些有效XML的一部分,例如

<root>
<first-value system-property="unique.setting.limit">3</first-value>
<second-value-limit>50000</second-value-limit>
</root>

您可以使用Perl的XML::Simple并执行以下操作:

perl -MXML::Simple -E '$xml = XMLin("file"); say $xml->{"first-value"}->{"content"}; say $xml->{"second-value-limit"}'

输出:

3
50000

如果XML结构更复杂,那么您可能需要深入钻取以获得所需的值。如果是这种情况,您应该编辑问题以显示更大的图片。

答案 2 :(得分:0)

使用sed

sed -E 's/.*limit"*>([0-9]+)<.*/\1/' file


说明:
.*负责处理字符串 limit

之前的所有内容

limit"*负责两行,一行limit",另一行limit

([0-9]+)负责匹配您的要求中所述的数字和数字。

\1实际上是捕捉模式的捷径。当模式将其全部或部分内容分组为一对括号时,它会捕获内容并将其临时存储在内存中。有关详细信息,请参阅https://www.inkling.com/read/introducing-regular-expressions-michael-fitzgerald-1st/chapter-4/capturing-groups-and

答案 3 :(得分:0)

        sed -e 's/[a-zA-Z.<\/>= \-]//g' file

答案 4 :(得分:0)

带参数扩展的脚本解决方案:

#!/bin/bash

while read line || test -n "$line" ; do
    value="${line%<*}"
    printf "%s\n" "${value##*\>}"
done <"$1"

<强>输出:

$ ./ltags.sh dat/ltags.txt
3
50000

答案 5 :(得分:0)

Ashkan的 awk 解决方案非常简单,但我建议使用 sed 解决方案接受非整数:

sed -n 's/[^>]*>\([.[:digit:]]*\)<.*/\1/p' input.txt

这将提取该行的第一个>字符与以下<之间的数字。在我的RE&#34;数字&#34;可以是空字符串,如果您不想接受空字符串,请将-r选项添加到 sed ,并将\([.[:digit:]]*\)替换为([.[:digit:]]+)