awk 学习实战
 
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
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 输入范围是1100的七个随机数


  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
     也可以这样写:
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
       。。。。。。。。。

4 实例4
从 warn.a 文件中提取包含“WARNING”或”FATAL”,同时不包含“IGNOR”的行,然后,提取以“:”分割的第五个字段?
[root@store_2 awk]# cat warn.a
1111111111111:WARNING:3333 :4444:  55551
2222222222222: FATAL:    3333 :4444:  55552
3333333333333: IGNORE   :3333 :4444:  55553
# awk '{if(($0~/WARNING/)||($0~/FATAL/)) print $0}' warn.a |awk -F: '{print $5}'
  55551
  55552
  or
# grep -E "FATAL|WARNING" warn.a |awk -F: '{ print $5 }'
  55551
  55552

5 实例5
添加一个新组为class01,然后,添加属于这个组的30个用户,用户名的形式为stdXX,其中,XX从 01到 30?
[root@store_2 awk]# cat users.sh
#!/bin/sh
groupadd class01
for((i=1;i<=9;i++))
do
  useradd -G class01 std0"$i"
  #userdel -r std0"$i"
done
for((i=10;i<=30;i++))
do
  useradd -G class01 std"$i"
  #userdel -r std$i
done

6 实例 6
在每个月的第一天备份并压缩/etc目录下的所有内容,存放在/root/backup目录里,且文件名为如下形式yymmdd_etc,yy为年,mm为月,dd为日
#crontab  -e
输入:
* * * 1 * tar -czf /tmp/$(date +%y%m%d)_etc1.tgz /etc > /dev/null 2>&1
* * * 1 * tar -czf /tmp/`date +%y%m%d`_etc.tgz /etc > /dev/null 2>&1

7 实例7
某系统管理员需要每天做一定的重复工作,编制一个解决方案:
(1).从下午 4:50 删除/abc 目录下的全部子目录和全部文件;
(2).从早上 8:00~下午 6:00每小时读取/xyz目录下x1 文件中每行第一个域的全部数据加入到/backup目录下的 back01.txt文件内;
(3).每逢周一下午 5:50 将/data目录下的所有目录和文件归档并压缩为文件backup.tar.gz;
(4).在下午 5:55 将IDE接口的CD-ROM缷载(假设CD-ROM的设备名为 hdc);
(5).在早上 8:00 开机后启动。
   答案:
(1)    4 * * *  rm –rf /abc/*
(2)    * 08-18 * * * awk ‘{print $1}’ /xyz/x1 >> /backup/back01.txt
(3)    50  17 * * 1 tar –czf backup.tar.gz /data >/dev/null 2>&1
(4)    55  17 * * * umount /dev/hdc
(5)    设定BIOS每日上午 08:00开机。




0

收藏

li_xiqing

160篇文章,34W+人气,0粉丝