这个网站过去对我帮助很大,但现在才注册,因为我无法找到现在正在尝试的确切答案。我希望你能帮忙。
我试图提取或剪切文件中字符串下的值。我的文件看起来像:
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,在这种情况下可能是一个四位数,在这种情况下列数会改变。
我希望我能清楚这个问题。
感谢任何帮助。
感谢。
答案 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