猫管道awk操作与文件上的awk命令的比较

Ans*_*hul 2 linux bash shell awk

在尝试优化与服务器有关的数据时,我和我的团队讨论了linux命令的用法。请会员请帮助我们更准确地理解该概念。

在服务器上,我们有每分钟创建的日志文件,我们需要搜索带有特定标签的日志,例如:错误日志,超时日志,请求失败日志。其中许多要求是提供有关这些标签计数的信息

简单的逻辑将是唤醒特定字段(使用定界符)以进行排序,并使用uniq -c命令来计算此类实例的数量。

我可以看到两种执行方法:

cat fname | awk -F":" {'print $1'} | sort | uniq -c
Run Code Online (Sandbox Code Playgroud)

awk -F":" {'print $1'} fname | sort | uniq -c
Run Code Online (Sandbox Code Playgroud)

文件大小可以以GB为单位,因此哪个命令可能更有效。

anu*_*ava 5

cat应避免使用绝对无用的:

awk -F":" '{print $1}' fname | sort | uniq -c
Run Code Online (Sandbox Code Playgroud)

但我的建议是通过使用以下方法找到本身独特的物品,从而避免昂贵sort和命令:uniqawk

awk -F":" '!seen[$1]++' fname
Run Code Online (Sandbox Code Playgroud)

这将打印独特的线条。

要获得唯一计数:

awk -F":" '!count[$1]++{c++} END{print c}' fname
Run Code Online (Sandbox Code Playgroud)

  • 一个更简单的替代方案是 `awk -F":" '!seen[$1]++' fname` (2认同)

Ed *_*ton 5

有3种方法可以打开文件并对文件内容进行awk操作:

  1. 猫打开文件:

    cat file | awk '...'
    
    Run Code Online (Sandbox Code Playgroud)
  2. Shell重定向打开文件:

    awk '...' < file
    
    Run Code Online (Sandbox Code Playgroud)
  3. awk打开文件

    awk '...' file
    
    Run Code Online (Sandbox Code Playgroud)

在这些选择中:

  1. 总是要避免的,因为catand管道正在使用资源并且没有提供任何价值,有关详细信息,请参见google UUOC(猫的无用使用)。

使用其他2个中的哪个值得商bat:

  1. 优点是外壳程序正在打开文件而不是工具,因此如果对所有工具都这样做,则可以依靠一致的错误处理
  2. 优点是该工具知道正在操作的文件的名称(例如awk中的FILENAME),因此您可以在内部使用该名称。

若要查看区别,请考虑以下两个文件:

$ ls -l file1 file2
-rw-r--r-- 1 Ed None 4 Mar 30 09:55 file1
--w------- 1 Ed None 0 Mar 30 09:55 file2
$ cat file1
a
b
$ cat file2
cat: file2: Permission denied
Run Code Online (Sandbox Code Playgroud)

并查看当您尝试使用两种打开方法在两种内容上运行awk时会发生什么:

$ awk '{print FILENAME, $0}' < file1
- a
- b

$ awk '{print FILENAME, $0}' file1
file1 a
file1 b

$ awk '{print FILENAME, $0}' < file2
-bash: file2: Permission denied

$ awk '{print FILENAME, $0}' file2
awk: fatal: cannot open file `file2' for reading (Permission denied)
Run Code Online (Sandbox Code Playgroud)

请注意,当您使用重定向时,用于打开无法读取的文件file2的错误消息来自外壳程序,因此与我第一次尝试使用该错误消息时看起来完全一样cat,而让awk打开它的错误消息则来自awk,并且有所不同从shell消息中获取,并且在各个awk中都不同。

请注意,在使用awk打开文件时,FILENAME会填充有正在操作的文件的名称,但是在使用重定向打开文件时,文件名会设置为-

我个人认为,“ 3”(填充文件名)的好处远远超过了“ 2”(对文件打开错误进行一致的错误处理)的好处,因此我将始终使用:

awk '...' file
Run Code Online (Sandbox Code Playgroud)

对于您的特定问题,您可以使用:

awk -F':' '{cnt[$1]++} END{for (i in cnt) print cnt[i], i}' fname
Run Code Online (Sandbox Code Playgroud)