如何从一条线上剪切特定字段?
问题是我无法使用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
答案 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选项中的更改。
约束到某个字段(例如12)
-F' +|,'
将字段分隔符设置为空格(一个或多个)或逗号, 其余的是计算字段并选择正确的字段进行打印。/pattern/
会过滤与正则表达式匹配的行,这些行可以&gt;仅被$12~/pattern/
如果您的文本可能包含大小写混合并且您希望不区分大小写,请使用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.]+)/
'
允许使用标签和空格。