使用cut或Awk的特定字段

时间:2016-04-12 14:06:32

标签: linux bash

如何从一条线上剪切特定字段?

问题是我无法使用cut -d ' ' -f 1,2,3,4,5,9,10,11,12,13,14,因为字段会发生变化。

假设我有一个名为/ var / log / test的文件,文件中的一行如下所示:

Apr 12 07:48:11 172.89.92.41 %ASA-5-713120: Group = People, Username = james.robert, IP = 219.89.259.32, PHASE 2 COMPLETED (msgid=9a4ce822)

我只需要获取用户名和时间/日期(请注意列不断变化,这就是为什么我需要匹配用户名= james.robert和4月12日07:48:11

当我使用时:

grep "james" /var/log/tes | cut -d ' ' -f 1,2,3,4,5,9,10,11,12,13,14 

不适合我。因此它必须匹配用户名并仅打印用户名和数据/时间。有什么建议?

好的,当我使用它时:

awk -F'[ ,]' '$12~/username/{print $1,$2,$3,$12}' /var/log/test

但它适用于某些用户,但不适用于其他用户,因为字段不断移动。

此命令的示例输出为:

Apr 12 06:00:39 james.robert

但是当我在这个用户名上尝试这个命令时,它不起作用。见下文:

这是另一个例子,上面的命令没有显示任何内容:

Apr  8 12:16:13 172.24.32.1 %ASA-6-713228: Group = people, Username = marry.tarin, IP = 209.157.190.11, Assigned private IP address 192.168.237.38 to remote user

5 个答案:

答案 0 :(得分:1)

如果您的文件结构一致

awk -F'[ ,]' '{print $1,$2,$3,$12}' file

Apr 12 07:48:11 james.robert

如果您需要使用您的示例输入匹配用户名

$ awk -F'[ ,]' '$12~/james/{print $1,$2,$3,$12}' file
Apr 12 07:48:11 james.robert

<强>更新

好的,你的空格不一致,要修改-F

$ awk -F' +|,' '{print $1,$2,$3,$12}' file

Apr 12 07:48:11 james.robert
Apr 8 12:16:13 marry.tarin

您可以添加/ pattern /以限制用户匹配,如上所述。请注意-F选项中的更改。

  

-F' +|,'将字段分隔符设置为空格(一个或多个)或逗号,   其余的是计算字段并选择正确的字段进行打印。   /pattern/会过滤与正则表达式匹配的行,这些行可以&gt;仅被$12~/pattern/

约束到某个字段(例如12)

如果您的文本可能包含大小写混合并且您希望不区分大小写,请使用tolower()函数,例如

$ awk -F' +|,' 'tolower($12)~/patterninlowercase/{print $1,$2,$3,$12}' file

答案 1 :(得分:1)

使用sed

sed -r 's/^([A-Za-z]{3} [0-9]{1,2} [0-9]{2}:[0-9]{2}:[0-9]{2}).*(Username = [^,]*).*/\1 \2/g' file

答案 2 :(得分:0)

您可以使用awk以逗号分隔,然后使用substr()length()来获取您关注的内容:

awk -F"," '{print substr($1,1,15), substring($3, 13, length($3)-12)}' /var/log/test

答案 3 :(得分:0)

使用gawk

awk '{u=gensub(/.*(Username = [^,]*).*/,"\\1","g",$0);if ( u ~ "james") {print u,$1,$2,$3}}' file

答案 4 :(得分:0)

以下perl将打印由选项卡分隔的日期和用户名。将其他有效的用户名字符添加到[\w.]

perl -ne '
    print $+{date}, "\t", $+{user}, "\n" if
        /^(?<date>([^\s]+\s+){2}[^\s]+).*\bUsername\s*=\s*(?<user>[\w.]+)/
    '

允许使用标签和空格。