awk学习实战

来源:岁月联盟 编辑:exp 时间:2011-09-29

1、实例1
怎样的shell才能使file1、file2两个文件的$2不同的话,取出全局$0?
注意:比较两个文件的$2的时候,一定要第一列相同的情况下才比较
1.1、操作文件
# cat file1
00001       20
00002       31
00003       04
00004       56
00005       94
00006       73
00007       25
00008       86
00009       19
00010       52
 
# cat file2
00001       20
00007       28
00002       32
00004       56
00010       52
 
 1.2 实现命令
# paste file1 file2|awk '{if(($1=$3)&&($2!=$4)) {print $0}}'
00007 31 00007 28
00002 04 00002 32
00010 94 00010 52
其它:
 #cat file1 file2|sort |uniq –u
 
三楼的答案是错的,我要的结果是
00002 31  32
00007 25  28
sort file1 >f1;sort file2 >f2; join -j1 1 f1 f2|awk '$2 != $3'
or
sort file1 >f1;sort file2 >f2; join -1 1 -2 1 f1 f2|awk '$2 != $3'
 
 
2、实例2
#cat fawk.a
1       xiao                  25      beijing        9000
2       liuwenjing             24      beijing        5000
3       weijianjun             29      shanghai      8000
4       wanmingyang          28      beijing        5000
5       tianzhiyu              25      beijing        5500
6       zhouhaoxing           23      beijing        5000
 
2.1 显示$2等xiao或$2等于liu的全行
[root@store_2 awk]# awk '{ if(($2=="xiao")||($2=="liu")) print $0 }' fawk.a
 1       xiao                  25      beijing        9000
 
2.3 显示$2等xiao或$2包含liu的行
[root@store_2 awk]# awk '{ if(($2=="xiao")||($2~/liu/)) print $0 }' fawk.a
 1       xiao                  25      beijing        9000
 2       liuwenjing             24      beijing        5000
 
2.3 计算共显示了多少行NR
[root@store_2 awk]# awk '{ print $0 } END { print "总行数:" NR }' fawk.a
 1       xiao                  25      beijing        9000
 2       liuwenjing            24      beijing         5000
 3       weijianjun            29      shanghai       8000
 4       wanmingyang           28      beijing       5000
 5       tianzhiyu             25      beijing         5500
 6       zhouhaoxing           23      beijing        5000
总行数:6
2.4 显示当前路径的最后一个目录名
echo $PWD | awk -F/ '{ print $NF}'
echo $PWD | awk -F/ '{ print NF}' # 显示列或域数目
echo $PWD | awk -F/ '{ print NF-1}' # 计算
2.4  替换函数
# hehe替换xiao
[root@store_2 awk]# awk 'gsub(/xiao/,"hehe")' fawk.a   //$0 中,xiao替换liu
 1       hehe                  25      beijing        9000
同:sed 's/xiao/hehe/' fawk.a ,但显示所有记录
2.5 长度函数
[root@store_2 awk]# awk '{ print length($4) }' fawk.a
7
7
…..
2.6 分割函数
split(s,a,t) //t为分隔标准,s为字符,a为数组,a[1],a[2]....
 
2.7 计算当然目录下所有文件大小
2.7.1  单命令
[root@store_2 awk]#  ll|awk '{total+=$5} { print $0} END { print total }' #可以加多个{}
总计 16
-rw-r--r-- 1 root root 354 10-29 01:55 fawk.a
-rwxr-xr-x 1 root root  61 10-29 04:34 it.awk
415
 
2.7.2  编程
[root@store_2 awk]# cat it.awk
#!/bin/awk -f
(total+=$5)
END {print "总大小:" total }
[root@store_2 awk]# ll|./it.awk
-rw-r--r-- 1 root root 354 10-29 01:55 fawk.a
-rwxr-xr-x 1 root root  61 10-29 04:34 it.awk
总大小:415
 
3 实例3
  3.1 删除所有空白行
将一个文件里所有的空白行删除
代码::
$ awk 'NF>0' test1.dat
one 123-321 234/22 a
two 344-637 726/28 c
three 273-287 287/97 d
four 872-872 282/20 c
  3.2 输出一个文件的偶数行
代码::
$ awk 'NR %2 ==0' test1.dat
two 344-637 726/28 c
four 872-872 282/20 c

  3.3 输入范围是1到100的七个随机数
代码::
$ awk 'BEGIN{for (i=1;i<7;i++) print int(101*rand())}'
24
29
85
15
59
19


  3.5 输出本目录下所有文件的字节数
代码::
]$ ls -l |awk '{x+=$5}; END{print x}'
15827
  3.6 显示UID>500的用户记录
   [root@store_2 awk]# awk -F: '$3>500 { print $0}' /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
    也可以这样写:
  [root@store_2 awk]# awk -F: '{ if($3>500)  print $0 }' /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
[root@store_2 awk]# awk -F: '{ if($3>500)  {print $0} }' /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
 
   以下为错误写法:
  a、 [root@store_2 awk]# awk -F: '{ $3>500  print $0 }' /etc/passwd
awk: { $3>500  print $0 }
awk:           ^ syntax error
  b、 awk -F: '{$3>500}  {print $0}' /etc/passwd
       root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
       。。。。。。。。。
作者“风云的博客”