从linux中的文件中提取字符串下的字符串

时间:2016-04-28 11:01:02

标签: linux shell awk sed grep

这个网站过去对我帮助很大,但现在才注册,因为我无法找到现在正在尝试的确切答案。我希望你能帮忙。

我试图提取或剪切文件中字符串下的值。我的文件看起来像:

Xmqqstab v1.0 - Developed by Oliver Fisse (ISSW)

 ****
 **** Tuesday, April 26, 2016 10:49:21 AM BST ****
 ****
       UNIX
 Report for queue(s): 'Q1' on queue manager 'QMGR'...

        CQD     PQF      MxQD   OIC   OUC    UNC  LGETDATE  LGETTIME  LPUTDATE  LPUTTIME  QOM G P   Local Queue Name
 ----------------------------------------------------------------------------------------------------------------------------------------------------
          5   0.10%      5000     0     0      0 2016-04-26 10.48.46 2016-04-26 10.49.01  26s E E - Q1

              1 queue(s) matching.

该文件实际上提供了MQ队列统计信息,并且我尝试获取的值为CQD=5(可以是任何数字编号),LGETTIME=10.48.46

我可以使用grep -A3 'CQD' file.txt | sed -n '3p'获取值的行。从行我将不得不按列切割值,但我认为这样做不准确,因为数字可能会变为5,在这种情况下可能是一个四位数,在这种情况下列数会改变。

我希望我能清楚这个问题。

感谢任何帮助。

感谢。

4 个答案:

答案 0 :(得分:3)

你可以选择这样的东西:

awk '/CQD/ { for (i = 1; i <= NF; ++i) if ($i == "CQD") col = i } col && $col == 5' file

在与感兴趣的字段名称匹配的行上,遍历每个字段以查找包含它的列。设置col并且列中的值与您想要的值匹配后,打印该行(默认操作)。

如果您愿意,可以将标题和值作为参数传递给脚本:

awk -v heading=CQD -v value=5 '$0 ~ heading { 
    for (i = 1; i <= NF; ++i) if ($i == heading) col = i 
} col && $col == value' file

使用这些方法中的任何一种,输出都是行:

          5   0.10%      5000     0     0      0 2016-04-26 10.48.46 2016-04-26 10.49.01  26s E E - Q1

......我假设的是你正在寻找的东西!

答案 1 :(得分:0)

使用sed

sed -rn '/CQD.*LGETTIME/{n;n; s/^ *([^ ]* *)([^ ]* *){6}([^ ]*).*/\1\3/p}'

输出:

$ sed -rn '/CQD.*LGETTIME/{n;n; s/^ *([^ ]* *)([^ ]* *){6}([^ ]*).*/\1\3/p}' file
5   10.48.46

答案 2 :(得分:0)

最简单的解决方案就是用您选择的分隔符替换多个空格,然后cut可以正常工作,就像您先计划一样:

grep -A3 'CQD' file.txt | sed -n '3p' | sed 's/  */_/g'  | cut -f2 -d'_'

这是用下划线替换多个空格的部分:

sed 's/  */_/g' 

答案 3 :(得分:0)

假设您感兴趣的数据是以数字开头的第一行:

read my_CQD my_LGETDATE <<< $(awk '$1 ~ /^[0-9]/ {print $1, $8; exit}' file.txt)

<强>解释

awk程序会监视第一个字段以数字开头的行。然后它打印由空格分隔的第1和第8个字段然后退出。 Bash将这两个值读入$my_CQD$my_LGETDATE

<强>输出:

echo -e "\$my_CQD: $my_CQD\n\$my_LGETDATE: $my_LGETDATE"
$my_CQD: 5
$my_LGETDATE: 10.48.46