最佳 awk 命令

Posted

技术标签:

【中文标题】最佳 awk 命令【英文标题】:Best Awk Commands 【发布时间】:2010-09-21 09:08:14 【问题描述】:

我发现 AWK 非常有用。这是我整理的用于处理数据的单行代码。

ls | awk ' print "awk " "'"'"'"  " print $1,$2,$3 " "'"'"'"  " " $1 ".old_ext > " $1    ".new_ext"  ' > file.csh

我使用此 AWK 制作了一个脚本文件,该文件将重命名某些文件并仅打印出选择性列。有谁知道更好的方法来做到这一点?你最好的 AWK 单线或巧妙的操作是什么?

【问题讨论】:

1.这可能应该成为社区维基。 2.问题太多。版主,请编辑这篇文章。谢谢 【参考方案1】:

AWK book 充满了很好的例子。以前是从Kernighan's webpage(现在是404s)收集下载的。

【讨论】:

您发布的链接给出了The object /cm/cs/awkbook/ does not exist on this server. 错误。请更新它们! @simlev: 更新书籍网址;现在不知道在哪里可以找到代码下载。【参考方案2】:

你可以找到几个不错的一号线here。

【讨论】:

【参考方案3】:

我用这个:

df -m | awk 'p+=$3; END print p'

汇总系统上跨文件系统使用的所有磁盘空间。

【讨论】:

【参考方案4】:

多年前我在awk中写了一个tail脚本:

#!/usr/bin/awk -f
BEGIN 
  lines=10



  high = NR % lines + 1
  a[high] = $0


END 
  for (i = 0; i < lines; i++) 
    n = (i + high) % lines + 1
    if (n in a) 
      print a[n]
    
  

这很愚蠢,我知道,但这就是 awk 对你所做的。玩起来很有趣。

【讨论】:

【参考方案5】:

Henry Spencer 在 awk 上写了一个相当不错的 nroff 实现。他称之为“awf”。他还声称,如果 Larry Wall 知道 awk 有多么强大,他就不需要发明 perl。

【讨论】:

【参考方案6】:

这里有几个我过去经常使用的 awk ... 请注意,您可以使用 $1、$2 等来获取所需的列。所以,为了操作一堆文件,例如这里有一个愚蠢的命令,你可以用它来代替 mv ...

ls -1 *.mp3 | awk 'printf("mv %s newDir/%s\n",$1,$1)' | /bin/sh

或者,如果您正在查看一组流程,也许......

ps -ef | grep -v username | awk 'printf("kill -9 %s\n",$2)' | /bin/sh

相当微不足道,但你可以看到这会给你带来很多好处。 =) 我以前做的大部分事情你都可以用 xargs 来做,但是,嘿,谁需要它们新奇的命令?

【讨论】:

【参考方案7】:

我经常使用这个脚本来编辑 PATH 和类似路径的环境变量。 用法:

export PATH=$(clnpath /new/bin:/other/bin:$PATH /old/bin:/other/old/bin)

此命令在 PATH 前面添加 /new/bin 和 /other/bin,从 PATH 中删除 /old/bin 和 /other/old/bin(如果存在 - 如果不存在则没有错误),并删除重复的目录条目在路上。

:   "@(#)$Id: clnpath.sh,v 1.6 1999/06/08 23:34:07 jleffler Exp $"
#
#   Print minimal version of $PATH, possibly removing some items

case $# in
0)  chop=""; path=$PATH:?;;
1)  chop=""; path=$1;;
2)  chop=$2; path=$1;;
*)  echo "Usage: `basename $0 .sh` [$PATH [remove:list]]" >&2
    exit 1;;
esac

# Beware of the quotes in the assignment to chop!
echo "$path" |
$AWK:-awk -F: '#
BEGIN              # Sort out which path components to omit
                    chop="'"$chop"'";
                    if (chop != "") nr = split(chop, remove); else nr = 0;
                    for (i = 1; i <= nr; i++)
                            omit[remove[i]] = 1;
            

    for (i = 1; i <= NF; i++)
    
            x=$i;
            if (x == "") x = ".";
            if (omit[x] == 0 && path[x]++ == 0)
            
                    output = output pad x;
                    pad = ":";
            
    
    print output;
'

【讨论】:

【参考方案8】:

统计httpd使用的内存

ps -ylC httpd | awk '/[0-9]/ SUM += $8 END print SUM/1024'

或通过替换 httpd 的任何其他进程。除以 1024 得到以 MB 为单位的输出。

【讨论】:

【参考方案9】:

我设法为 UNIX (find + awk) 构建了一个 DOS 树命令模拟器:

find . -type d -print 2>/dev/null|awk 'for (i=1;i< NF;i++)printf("%"length($i)"s","|");gsub(/[^\/]*\//,"--",$0);print $NF'  FS='/'

【讨论】:

【参考方案10】:

在两个图案之间打印线条:

awk '/END/flag=0flag;/START/flag=1' inputFile

详解:http://nixtip.wordpress.com/2010/10/12/print-lines-between-two-patterns-the-awk-way/

【讨论】:

【参考方案11】:

几个最喜欢的,基本上彼此无关。阅读为 2 个不同的、不相关的建议。

轻松识别列号

对于那些经常使用 awk 的人,就像我在工作中进行日志分析一样,我经常发现自己需要找出文件的列号。因此,如果我正在分析 Apache 访问文件(可以在 here 找到一些示例),我会针对该文件运行以下脚本:

NR == 1 
        for (i = 1 ; i <= NF ; i++)
                
                print i "\t" $i
                
        
NR > 1  
        exit
        

我通常称它为“cn.awk”,表示“c'olumn 'n'numbers。有创意吧?无论如何,输出看起来像:

1   64.242.88.10
2   -
3   -
4   [07/Mar/2004:16:05:49
5   -0800]
6   "GET
7   /twiki/bin/edit/Main/Double_bounce_sender?topicparent=Main.ConfigurationVariables
8   HTTP/1.1"
9   401
10  12846

很容易分辨是什么。我通常在我的服务器上给它起别名,并且到处都有。


按名称引用字段

现在,假设您的文件有一个标题行,并且您宁愿使用这些名称而不是字段编号。这允许您这样做:

NR == 1 
    for (i = 1 ; i <= NF ; i++)
        
        field[$i] = i
        
    

现在,假设我有这个标题行...

metric,time,val,location,http_status,http_request

...我想总结val 列。我可以通过名称来引用它,而不是引用 $3:

NR > 1  
    SUM += $field["val"]
    

主要好处是使脚本更具可读性。

【讨论】:

【参考方案12】:

打印字段是大多数 AWK 教程中首先提到的内容之一。

awk 'print $1,$3' file

鲜为人知但同样有用的是排除字段,这也是可能的:

awk '$1=$3=""1' file

【讨论】:

以上是关于最佳 awk 命令的主要内容,如果未能解决你的问题,请参考以下文章

Linux三剑客awk命令篇二:命令操作符

awk 命令

Linux入门系列——awk命令详解

如何在Linux中使用awk命令

shell命令三剑客之awk命令详解,cut命令,linux里记录行踪(操作记录)

利用awk命令进行统计