我一直在尝试从文件中的一行中提取字段,尽管每行可能每行有正负2或3个字段。它们并不总是等于每行的字段数。
这是一个片段:
A orarpp 45286124 1 1 0 20 60 Nov 25 9-16:42:32 01:04:58 11176 117056 0 - oracleXXX (LOCAL=NO)
A orarpp 45351560 1 1 3 20 61 Nov 30 5-03:54:42 02:24:48 4804 110684 0 - ora_w002_XXX
A orarpp 45548236 1 1 22 20 71 Nov 26 8-19:36:28 00:56:18 10628 116508 0 - oracleXXX (LOCAL=NO)
A orarpp 45679190 1 1 0 20 60 Nov 28 6-23:42:20 00:37:59 10232 116112 0 - oracleXXX (LOCAL=NO)
A orarpp 45744808 1 1 0 20 60 10:52:19 23:08:12 00:04:58 11740 117620 0 - oracleXXX (LOCAL=NO)
A root 45810380 1 1 0 -- 39 Nov 25 9-19:54:34 00:00:00 448 448 0 - garbage
在第一行的情况下,我对9-16:42:32以及每行的相似字段感兴趣。
我试图通过使用':'作为字段分隔符然后从那里过滤来拉它,但是我想要完成的是如果破折号之前的数字(在示例中为9)是大于一。
cat file.txt | grep oracle | awk -F: '{print substr($1, length($1)-5)}'
这是因为我需要的实际字段两边的字段数可能因行而异。
绝对不是效率最高的,但我一直试图用一个awk单行班。
提示或方向将会让我再次感动。我并不反对以比awk更好的方式做事。
感谢。
答案 0 :(得分:4)
也许cut
是这项工作的正确工具?例如,使用您的代码段:
$ cut -c 62-71 file.txt
9-16:42:32
5-03:54:42
8-19:36:28
6-23:42:20
23:08:12
9-19:54:34
参数告诉cut
剪切列(-c
)62到71。
要进行其他处理,您可以将其发送到awk
。
您还可以通过接受整行,然后使用awk
提取所需的列来完成substr
中的整个操作。例如,此awk
命令生成与上面的cut
命令相同的输出:
awk '{ print substr($0, 62, 10) }' file.txt
无论是创建管道还是完全在awk
进行处理,至少部分是个人品味/风格。
答案 1 :(得分:2)
这会吗?
awk -F: '/oracle/ {print substr($0,62,10)}' file.txt
9-16:42:32
8-19:36:28
6-23:42:20
23:08:12
搜索oracle
,然后从位置10
62
个字符
答案 2 :(得分:2)
您可以使用
之一获取这些标识符grep -o '[[:digit:]]\+-[[:digit:]]\{2\}:[[:digit:]]\{2\}:[[:digit:]]\{2\}'
grep -oP '\d+-\d\d:\d\d:\d\d' # GNU grep
听起来你想用线条做点什么,而不仅仅是找到ID。请详细说明。
使用GNU awk:
gawk --re-interval '
/oracle/ && \
match($0, /([[:digit:]]+)-([[:digit:]]{2}:){2}[[:digit:]]{2}/, a) && \
a[1]>1 {
# do something with the matching line
print
}
' file