Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用cut或Awk的特定字段_Linux_Bash - Fatal编程技术网

Linux 使用cut或Awk的特定字段

Linux 使用cut或Awk的特定字段,linux,bash,Linux,Bash,如何从直线上剪切特定字段 问题是我不能使用cut-d'-f1,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) 我只需要获得

如何从直线上剪切特定字段

问题是我不能使用
cut-d'-f1,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和Apr 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
但它对某些用户有效,但对其他用户无效,因为字段不断移动

此命令的示例输出为:

4月12日06:00:39詹姆斯·罗伯特

但当我在此用户名上尝试此命令时,它不起作用。请参见以下内容:

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

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

您可以使用
awk
以逗号分隔,然后使用
substr()
length()
获取您关心的片段:

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

您可以使用
awk
以逗号分隔,然后使用
substr()
length()
获取您关心的片段:

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

如果您的文件结构一致

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/
将筛选与正则表达式模式匹配的行,该行可通过
$12~/pattern/
仅限于特定字段(例如12)

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

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

如果您的文件结构一致

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/
将筛选与正则表达式模式匹配的行,该行可通过
$12~/pattern/
仅限于特定字段(例如12)

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

$ awk -F' +|,' 'tolower($12)~/patterninlowercase/{print $1,$2,$3,$12}' file
使用
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
使用
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
gawk

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

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

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

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

允许不同数量的制表符和空格。

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

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

允许使用不同数量的制表符和空格。

这给了我一个错误。这甚至会尝试在哪里匹配用户名?这里的假设不是逗号的位置是一致的,因此您的
username=
字段位于第三位。如果您从您的日志文件,以便我们了解这些记录可能采用的不同格式。我们所能做的最好是尽可能广泛地编写代码,并希望它能够捕获您的所有边缘情况。但是,如果看不到格式不同的记录,就很难猜到这些记录。这给了我一个错误。这甚至会在哪里尝试匹配用户名?这里的假设是逗号的位置是一致的,因此您的
用户名=
字段位于第三位。也许……如果您从日志文件中包含多条记录,这会很有帮助,这样我们就可以了解这些记录可能采用的不同格式。我们所能做的最好是代码的范围尽可能广,我们可以猜测,并希望它抓住你所有的边缘情况。虽然没有看到不同格式的记录,但很难猜测这些。它给了我不同的结果。还有它与用户名匹配的地方?请发布,你期望看到的和你得到的。好的,这工作得更好,但仍然有一些问题。问题是,不可能以不同的方式获取日期、用户名和日期?因为它适用于2、3个用户,但当我用不同的名称键入第4个用户时,它不会显示任何内容。是否有其他机制?有很多种方法,但我们在这里是在黑暗中拍摄的,请用案例y更新您的原始问题您正在测试并发布预期的输出。未工作的用户,她的名字保存在以下文件中:Apr 8 12:51:45 172.24.32.1%ASA-6-713273:Group=people,Username=mary.tarin,IP=189.157.111.9,删除客户端地址的静态路由:192.168.12.14这会给我不同的结果。它在哪里与Username匹配?pl轻松发布,您希望看到的内容和您得到的内容。好吧,这样做效果更好,但仍然存在一些问题。问题是,不可能以不同的方式获取日期、用户名和日期?因为它适用于2、3个用户,但当我用不同的名称键入第4个用户时,它不会显示任何内容。还有其他机制吗