AWK - 过滤文件的字段不相等

时间:2013-12-05 21:05:19

标签: sed awk

我一直在尝试从文件中的一行中提取字段,尽管每行可能每行有正负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更好的方式做事。

感谢。

3 个答案:

答案 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