我对shell中的精髓是awk不敢苟同,不过awk对字符串的处理很是蛮强大的。
平时做unix/linux管理的朋友对cat、grep等肯定不会陌生,但我要说,awk才是shell中的精髓所在。
我们可以把awk看作一个小的c语言的实现,awk的灵活多变黎补了shell的不足。
学习awk可以从“man awk”开始,但更高级的用法,可以参考网上的更详尽的文档。nawk是awk的兄弟,算是awk的一个高级实现,能实现更多的更高级(好用)的应用。
不会用awk,别说你已经懂了shell编程。
这里附录一下awk的常识:
1、awk程序体的一般格式为:
awk '
BEGIN{} #程序开始前的预处理部分可以对一些变量进行初始化
{} #对每条记录进行操作的主体部分
END{}' <文件名> #程序的结束部分,可以对处理的结果作一些善后或总结
2、awk的程序风格完全可以按照c语言的风格书写。例如:
awk '{
if ($1 == "FIND")
regex = $2;
else
{
where = match($0, regex);
if (where)
printf("Match of %s found at %d in %s",regex,where,$0);
}
}' <文件名>
当然,awk支持一些更简洁的书写风格,例如上面的printf语句可以写成:
print "Match of", regex, "found at", where, "in", $0
3、记录和字段的表示法。
整条记录表示为$0,第n个字段表示为$n
4、常用内在变量。
NR 是记录号,即当前正在处理第几条记录。
NF 是当前记录共有多少个字段,
这样,每条记录最后一个字段可表示为$NF,倒数第2个字段可表示为$(NF-1)
FS 是一个说明各个字段如何分隔开的预定义变量.
这经常用于BEGIN语句体中预定义,类似于cut中的-d功能.
RS 是一个说明各个记录如何分隔开的预定义变量.
这经常用于BEGIN语句体中预定义,例如,RS=":" 表示各条记录是用":"分开的.
OFS 定义各字段在输出时如何分隔开.
ORS 定义各条记录在输出时如何分隔开.
5、输出重定向。
例如:
awk '{ print $2 > "phone-list"
print $1 > "name-list" }' BBS-list
双引号内为文件名。
6、在awk中利用管道向shell命令传递参数。
例如:
awk '{ print $1 > "names.unsorted"
print $1 | "sort -r > names.sorted" }' BBS-list
7、awk的特有函数和其它功能请参阅awk手册。
另外,nawk比awk具有更多的功能,它能够把shell中的变量传递给nawk。
nawk格式:
Usage: nawk [-f programfile | 'program'] [-Ffieldstep] [-v var=value] [files]
例如,可以这样向nawk传递shell变量:
nawk -v dr=$HOME -v pk=`hostname` 'BEGIN{print dr pk}'
平时做unix/linux管理的朋友对cat、grep等肯定不会陌生,但我要说,awk才是shell中的精髓所在。
我们可以把awk看作一个小的c语言的实现,awk的灵活多变黎补了shell的不足。
学习awk可以从“man awk”开始,但更高级的用法,可以参考网上的更详尽的文档。nawk是awk的兄弟,算是awk的一个高级实现,能实现更多的更高级(好用)的应用。
不会用awk,别说你已经懂了shell编程。
这里附录一下awk的常识:
1、awk程序体的一般格式为:
awk '
BEGIN{} #程序开始前的预处理部分可以对一些变量进行初始化
{} #对每条记录进行操作的主体部分
END{}' <文件名> #程序的结束部分,可以对处理的结果作一些善后或总结
2、awk的程序风格完全可以按照c语言的风格书写。例如:
awk '{
if ($1 == "FIND")
regex = $2;
else
{
where = match($0, regex);
if (where)
printf("Match of %s found at %d in %s",regex,where,$0);
}
}' <文件名>
当然,awk支持一些更简洁的书写风格,例如上面的printf语句可以写成:
print "Match of", regex, "found at", where, "in", $0
3、记录和字段的表示法。
整条记录表示为$0,第n个字段表示为$n
4、常用内在变量。
NR 是记录号,即当前正在处理第几条记录。
NF 是当前记录共有多少个字段,
这样,每条记录最后一个字段可表示为$NF,倒数第2个字段可表示为$(NF-1)
FS 是一个说明各个字段如何分隔开的预定义变量.
这经常用于BEGIN语句体中预定义,类似于cut中的-d功能.
RS 是一个说明各个记录如何分隔开的预定义变量.
这经常用于BEGIN语句体中预定义,例如,RS=":" 表示各条记录是用":"分开的.
OFS 定义各字段在输出时如何分隔开.
ORS 定义各条记录在输出时如何分隔开.
5、输出重定向。
例如:
awk '{ print $2 > "phone-list"
print $1 > "name-list" }' BBS-list
双引号内为文件名。
6、在awk中利用管道向shell命令传递参数。
例如:
awk '{ print $1 > "names.unsorted"
print $1 | "sort -r > names.sorted" }' BBS-list
7、awk的特有函数和其它功能请参阅awk手册。
另外,nawk比awk具有更多的功能,它能够把shell中的变量传递给nawk。
nawk格式:
Usage: nawk [-f programfile | 'program'] [-Ffieldstep] [-v var=value] [files]
例如,可以这样向nawk传递shell变量:
nawk -v dr=$HOME -v pk=`hostname` 'BEGIN{print dr pk}'
作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/2307/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!
评论列表