shell三剑客之awk 2

系列文章目录

shell三剑客之awk 2


一、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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值