我发现AWK非常有用。这是我用来操纵数据的一个班轮。
ls | awk '{ print "awk " "'"'"'" " {print $1,$2,$3} " "'"'"'" " " $1 ".old_ext > " $1 ".new_ext" }' > file.csh
我使用此AWK制作一个脚本文件,该文件将重命名某些文件并仅打印出选择性列。有人知道更好的方法吗?什么是最好的AWK一个衬垫或聪明的操作?
答案 0 :(得分:6)
AWK book充满了很好的例子。以前从Kernighan's webpage(现在是404s)收集下载文件。
答案 1 :(得分:4)
您可以找到几个不错的单行here。
答案 2 :(得分:2)
我用这个:
df -m | awk '{p+=$3}; END {print p}'
总计跨文件系统在系统上使用的所有磁盘空间。
答案 3 :(得分:2)
很多年前我在awk中编写了一个尾部脚本:
#!/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对你做的事情。玩它真的很有趣。
答案 4 :(得分:1)
Henry Spencer在awk上写了一个相当不错的nroff实现。他称之为“awf”。他还声称如果Larry Wall知道awk有多强大,他就不需要发明perl。
答案 5 :(得分:1)
以下是我经常使用的几个问题...请注意,您可以使用$ 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,但是嘿,谁需要新的命令?
答案 6 :(得分:1)
我经常使用这个脚本来编辑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;
}'
答案 7 :(得分:0)
计算httpd
使用的内存ps -ylC httpd | awk '/[0-9]/ {SUM += $8} END {print SUM/1024}'
或通过替换httpd的任何其他过程。除以1024得到以MB为单位的输出。
答案 8 :(得分:0)
我设法为UNIX构建了一个DOS树命令模拟器(find + awk):
find . -type d -print 2>/dev/null|awk '{for (i=1;i< NF;i++)printf("%"length($i)"s","|");gsub(/[^\/]*\//,"--",$0);print $NF}' FS='/'
答案 9 :(得分:0)
在两种模式之间打印线条:
awk '/END/{flag=0}flag;/START/{flag=1}' inputFile
详细说明:http://nixtip.wordpress.com/2010/10/12/print-lines-between-two-patterns-the-awk-way/
答案 10 :(得分:0)
几个最爱,基本上彼此无关。阅读为2个不同的,未连接的建议。
对于那些经常使用awk的人,就像我在工作中进行日志分析一样,我经常发现自己需要找出文件的列号是什么。所以,如果我正在分析,比如Apache访问文件(可以找到一些样本here),我会针对该文件运行下面的脚本:
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
}
}
现在,假设我有这个标题行......
metric,time,val,location,http_status,http_request
...我想对val
列进行总结。我没有提到$ 3,而是可以通过名称来引用它:
NR > 1 {
SUM += $field["val"]
}
主要好处是使脚本更具可读性。
答案 11 :(得分:0)
打印字段是大多数AWK教程中提到的第一件事。
Property2
鲜为人知但同样有用的是排除可能的字段:
awk '{print $1,$3}' file