awk
学习实战
怎样的
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
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
[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-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
单命令
总计
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
删除所有空白行
将一个文件里所有的空白行删除
3.3 输入范围是1到100的七个随机数
3.5 输出本目录下所有文件的字节数
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开机。
代码::
|
$ 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
。。。。。。。。。
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
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开机。
©著作权归作者所有:来自51CTO博客作者li_xiqing的原创作品,如需转载,请注明出处,否则将追究法律责任
0
收藏
转载于:https://blog.51cto.com/cwind/676331