系列文章目录
shell三剑客之awk 2shell三剑客之awk
一、awk用法
awk 用法
awk -F 分割符(没加默认是空格,不管多少个空格都算一个)BEGIN{ } 可加条件 { } END { } FILENAME(文件名称本身)
NR 行数 | NF 列数 |
---|---|
¥0 所有的列 | ¥1第一列 |
¥2第两列 | ¥3第三列 |
“ ”双引号,表示字符串本身
没有加双引号表示字符串的变量
部分:先打印yan,在打印第五列,最后打印end
条件
/bash$/ 条件
/条件1|条件2/ 条件1或者条件2
/条件1/||/条件2/ 条件1或者条件2
/条件1/&&/条件2/ 条件1并且条件2
[root@docker3 mnt]# awk -F : 'BEGIN{print "yan"}{print $5}END{print "end"}' passwd
yan
root
bin
daemon
halt
operator
end
显示文件有多少行
[root@docker3 mnt]# awk -F : 'BEGIN{N=0}{N++}END{print N}' passwd
11
条件可以加多个,用;分开
[root@docker3 mnt]# awk -F : 'BEGIN{N=0}/bash/{N++;print $7}END{print N}' passwd
/bin/bash
/bin/bash
2
[root@docker3 mnt]# awk -F : 'BEGIN{N=0}/bash/{N++;print $7}END{print N}' passwd
/bin/bash
/bin/bash
2
[root@docker3 mnt]# awk -F : 'BEGIN{N=0}/bash/{N++;print $0}END{print N}' passwd
root:x:0:0:root:/root:/bin/bash
yan:x:1000:1000::/home/yan:/bin/bash
2
反选!
[root@docker3 mnt]# awk -F : 'BEGIN{N=0}!/bash/{N++;print $0}END{print N}' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
9
多条件或与且
[root@docker3 mnt]# awk -F : 'BEGIN{N=0}/bash|nologin/{N++;print $0}END{print N}' 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
ndbox the tcsd daemon:/dev/null:/sbin/nologin
yan:x:1000:1000::/home/yan:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
10
[root@docker3 mnt]# awk -F : 'BEGIN{N=0}/^root/&&/bash$/{N++;print $0}END{print N}' passwd
root:x:0:0:root:/root:/bin/bash
1
NR表示行数
[root@docker3 mnt]# awk -F : 'NR==1{print $0}' passwd
root:x:0:0:root:/root:/bin/bash
[root@docker3 mnt]# awk -F : 'NR==2{print $0}' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
[root@docker3 mnt]# awk -F : '{print NR}' passwd
1
2
3
4
5
6
7
8
9
10
11
NF表示列数
[root@docker3 mnt]# awk -F : '{print NF}' passwd
7
7
7
7
7
7
7
7
7
7
7
[root@docker3 mnt]# awk -F : '{print FILENAME}' passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
“ ”双引号,表示字符串本身
没有加双引号表示字符串的变量
[root@docker3 mnt]# awk -F : 'BEGIN{YAN=1}{print YAN}' passwd
1
1
1
1
1
1
1
1
1
1
1
[root@docker3 mnt]# awk -F : 'BEGIN{YAN=1}{print "YAN"}' passwd
YAN
YAN
YAN
YAN
YAN
YAN
YAN
YAN
YAN
YAN
YAN
~表示是
[root@docker3 mnt]# awk -F : '$7~/bash/{print $0}' passwd
root:x:0:0:root:/root:/bin/bash
yan:x:1000:1000::/home/yan:/bin/bash
!~不是
[root@docker3 mnt]# awk -F : '$7!~/bash/{print $0}' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
awk结合命令
[root@docker3 mnt]# awk '{print "date"}' passwd
date
date
date
date
date
date
date
date
date
date
date
[root@docker3 mnt]# awk '{print "date"}' passwd | bash
Sun Feb 20 05:22:11 CST 2022
Sun Feb 20 05:22:11 CST 2022
Sun Feb 20 05:22:11 CST 2022
Sun Feb 20 05:22:11 CST 2022
Sun Feb 20 05:22:11 CST 2022
Sun Feb 20 05:22:11 CST 2022
Sun Feb 20 05:22:11 CST 2022
Sun Feb 20 05:22:11 CST 2022
Sun Feb 20 05:22:11 CST 2022
Sun Feb 20 05:22:11 CST 2022
Sun Feb 20 05:22:11 CST 2022
二、 awk用法练习
/etc/passwd文件的第六列没有home关键字并且以bash结尾的行
[root@docker3 mnt]# awk -F : '$6!~/home/&&/bash$/{print}' passwd
root:x:0:0:root:/root:/bin/bash
统计在系统中能用su切换的并且用户家目录不在/home下的用户数量
错的
[root@docker3 mnt]# awk -F : 'BEGIN{N=0}$7~/bash/&&$6!~/^home/{N++;print $0}END{print N}' passwd
root:x:0:0:root:/root:/bin/bash
yan:x:1000:1000::/home/yan:/bin/bash
2
应该是3个,useradd -d 指定家目录
[root@docker3 mnt]# useradd -d /mnt/test -s /bin/sh yan2
[root@docker3 mnt]# su - yan2
-sh-4.2$ pwd
/mnt/test
[root@docker3 mnt]# awk -F : 'BEGIN{N=0}$7~/bash/&&$6!~/^home/{N++;print $0}END{print N}' passwd
root:x:0:0:root:/root:/bin/bash
yan:x:1000:1000::/home/yan:/bin/bash
2
useradd -d /mnt/test -s /bin/sh yan2
[kiosk@foundation38 Desktop]$ awk -F : 'BEGIN{N=0}$7~/bash¥|\<sh\>¥/ &&$6!~/^home/{N++;print $0}END{print N}' passwd
root:x:0:0:root:/root:/bin/bash
yan:x:1000:1000::/home/yan:/bin/bash
yan2:x:1002:1002::/mnt/test:/bin/sh
3
三、书写脚本通过用户文件建立用户
写个脚本
写个用户文件,启动脚本就能使得用户文件写的用户创建出来
[root@docker3 mnt]# cat userlist
y1
w2
q3
[root@docker3 mnt]# sh user_create.sh /mnt
/mnt is not exist or /mnt is not file
[root@docker3 mnt]# sh user_create.sh userlist
[root@docker3 mnt]# cat /etc/passwd
y1:x:1003:1003::/home/y1:/bin/bash
w2:x:1004:1004::/home/w2:/bin/bash
q3:x:1005:1005::/home/q3:/bin/bash
xargs使输出通过管道变成输入的时候,成为命令的操作对象而不是参数
[root@docker3 mnt]# ls | cat
user_create.sh
userlist
[root@docker3 mnt]# ls | xargs cat
#!/bin/bash
[ -e "$*" -a -f "$*" ] ||{
echo "$*" is not exist or $* is not file
exit
}
awk '{print "useradd " $0}' $* | bash
y2
w3
q4
[root@docker3 mnt]# ls | rm -fr
[root@docker3 mnt]# ls
user_create.sh userlist
[root@docker3 mnt]# ls | xargs rm -fr
[root@docker3 mnt]# ls
[root@docker3 mnt]#
END