awk和sed最大的不同,是awd后面的指令可以写复杂的多条语句,函数等,如判断if等。所以awk与其说是编辑器不如说是一种类似C的编程语言。
ls -l|awk '{if ($5>1) {print '$9'}}'
1 awk文件名添加后缀
A69126FB80815A8AB472C3221B.gif加后缀,执行结果为A69126FB80815A8AB472C3221B.gif.aa
ls | grep gif | awk -F'.' '{print }'|xargs -i mv {} {}.aa
ls | awk -F'.' '{print }'|xargs -i mv {} {}.aa
2 awk替换
字符串“zhangqing19800425”,其中的字母截取出来赋给变量name,数字部分赋给变量birthday
a)
echo zhangqing19800425 | awk '{
> a=match($0,/[0-9]/)
> name=substr($0,0,a-1)
> birth=substr($0,a)
> print name "/t" birth }'
b)
name=$(echo $str|awk '{gsub(/[0-9]/,"",$0);print}')
--用空替换数字得到名字
birth=$(echo $str|awk '{gsub(/[^0-9]/,"",$0);print}')
--用空替换非数字得到生日
3 字符串函数
a) sub
sub (regular expression, substitution string):
sub (regular expression, substitution string, target string)
实例:
$ awk '{ sub(/test/, "mytest"); print }' testfile
$ awk '{ sub(/test/, "mytest"); $1}; print }' testfile
第一个例子匹配test,匹配的都被替换成mytest。
第二个例子第一个域中匹配,所有匹配的都被替换成mytest。
b) index
index函数返回子字符串第一次被匹配的位置,偏移量从位置1开始。格式如下:
index(string, substring)
实例:
$ awk '{ print index("test", "mytest") }' testfile
实例返回test在mytest的位置,结果应该是3。
c) length
length函数返回记录的字符数。格式如下:
length( string )
length
实例:
$ awk '{ print length( "test" ) }'
$ awk '{ print length }' testfile
第一个实例返回test字符串的长度。
第二个实例返回testfile文件中第条记录的字符数。
d)substr
substr函数返回从位置1开始的子字符串,如果指定长度超过实际长度,就返回整个字符串。格式如下:
substr( string, starting position )
substr( string, starting position, length of string )
实例:
$ awk '{ print substr( "hello world", 7,11 ) }'
上例截取了world子字符串。
e)match
match函数返回在字符串中正则表达式位置的索引,如果找不到指定的正则表达式则返回0。match函数会设置内建变量RSTART为字符串中子字符串的开始位置,RLENGTH为到子字符串末尾的字符个数。substr可利于这些变量来截取字符串。函数格式如下:
match( string, regular expression )
实例:
$ awk '{start=match("this is a test",/[a-z]+$/); print start}'
$ awk '{start=match("this is a test",/[a-z]+$/); print start, RSTART, RLENGTH }'
第一个实例打印以连续小写字符结尾的开始位置,这里是11。
第二个实例还打印RSTART和RLENGTH变量,这里是11(start),11(RSTART),4(RLENGTH)。
f) toupper tolower
toupper和tolower函数可用于字符串大小间的转换,该功能只在gawk中有效。格式如下:
toupper( string )
tolower( string )
实例:
$ awk '{ print toupper("test"), tolower("TEST") }'
g) split
split函数可按给定的分隔符把字符串分割为一个数组。如果分隔符没提供,则按当前FS值进行分割。格式如下:
split( string, array, field separator )
split( string, array )
实例:
$ awk '{ split( "20:18:00", time, ":" ); print time[2] }'
上例把时间按冒号分割到time数组内,并显示第二个数组元素18。