我发现AWK非常有用。这是我用来操纵数据的一个班轮。

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

我使用此AWK制作一个脚本文件,该文件将重命名某些文件并仅打印出选择性列。有人知道更好的方法吗?什么是最好的AWK一个衬垫或聪明的操作?

有帮助吗?

解决方案

AWK书充满了很好的例子。以前从 Kernighan的网页收集下载文件(现在是404s)。

其他提示

我用这个:

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

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

很多年前我在awk中编写了一个尾部脚本:

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

{
  high = NR % lines + 1
  a[high] = <*>
}

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

这很愚蠢,我知道,但这就是awk对你做的事情。玩它真的很有趣。

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

以下是我经常使用的几个问题...请注意,您可以使用$ 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,但是嘿,谁需要新的命令?

我经常使用这个脚本来编辑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 <*>quot;
#
#   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 <*> .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;
}'

计算httpd

使用的内存
ps -ylC httpd | awk '/[0-9]/ {SUM += $8} END {print SUM/1024}'

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

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

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

几个最爱,基本上彼此无关。阅读为2个不同的,未连接的建议。

轻松识别列号

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

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

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

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
        }
    }

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

<代码>度量,时间,VAL,位置,HTTP_STATUS,HTTP_REQUEST

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

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

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

打印字段是大多数AWK教程中提到的第一件事。

awk '{print $1,$3}' file

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

awk '{$1=$3=""}1' file
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top