awk是一个强大的文本分析工具,它把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
`awk ‘{pattern + action}’ {filenames}`
pattern:表示awk在数据中查找的内容;使用正则表达式则需要//括起来
action:表示action 是在找到匹配内容时所执行的一系列命令。
awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。
三种调用方式
1、命令行方式
awk [-F file-seperator] 'commands' input-file
commands是awk命令,[-F file-seperator]是可选的。input-file是待处理文件,
2、shell脚本方式
即,将所有awk命令写入一个文件,并该文件执行。然后awk命令解释器作为脚本的首行,一遍通过键入脚本名称来调用。首行通常为:#!/bin/bash
3、将所有命令插入一个单独文件,然后调用;
awk -f awk-script-file input-file
-f加载awk-script-file的awk脚本。
举例说明
命令行方式
只是显示/etc/passwd的用户名和所在行数,中间使用制表键空格。
[root@nginx ~]# awk -F: '{print NR" "$1}' /etc/passwd 1 root 2 bin 3 daemon 4 adm 5 lp 6 sync 7 shutdown 8 halt 9 mail 10 operator 11 games 12 ftp 13 nobody 14 systemd-bus-proxy 15 systemd-network 16 dbus 17 polkitd 18 abrt 19 unbound 20 tss 21 libstoragemgmt 22 rpc 23 colord 24 usbmuxd 25 saslauth 26 geoclue 27 rtkit 28 rpcuser 29 nfsnobody 30 radvd 31 qemu 32 ntp 33 chrony 34 setroubleshoot 35 sssd 36 pulse 37 gdm 38 gnome-initial-setup 39 sshd 40 avahi 41 postfix 42 tcpdump 43 kyle 44 tom 45 jack
显示/etc/passwd的用户名即共分割的段数
[root@nginx ~]# awk -F: '{print $1,"===",NF}' /etc/passwd root === 7 bin === 7 daemon === 7 adm === 7 lp === 7 sync === 7 shutdown === 7 halt === 7 mail === 7 operator === 7 games === 7
显示/etc/passwd 行数大于2,小于5的用户名即行数
[root@nginx ~]# awk -F: 'NR > 2 && NR < 5 {print $1,"===",NR}' /etc/passwd daemon === 3 adm === 4
使用正则表达式的awk:
[root@nginx ~]# awk -F: '/bash$/{print $1,"===",NR}' /etc/passwd root === 1 kyle === 43 tom === 44 jack === 45 rose === 46
对第7段操作使用“~”
[root@nginx ~]# awk -F: '$7~/h$/{print $7,"===",NR}' /etc/passwd /bin/bash === 1 /bin/bash === 43 /bin/bash === 44 /bin/bash === 45 /bin/bash === 46 /bin/bash === 51 /bin/bash === 52 /bin/bash === 53 /bin/bash === 54 /bin/bash === 55
awk可以使用变量:使用awk -v 如:
设置变量count=500
[root@nginx ~]# count=500
[root@nginx ~]# awk -v x=$count -F: '$3>=x{print $1,"===",NR}' /etc/passwd systemd-bus-proxy === 14 polkitd === 17 unbound === 19 libstoragemgmt === 21 colord === 23 saslauth === 25 geoclue === 26 nfsnobody === 29 chrony === 33 setroubleshoot === 34 sssd === 35 gnome-initial-setup === 38 kyle === 43 tom === 44 jack === 45 rose === 46
bash命令补充知识
变量,用于表示程序运行的一些状态变化
命名规则:以字母或下划线开头,余下的可以是字母、数字和下划线
一般性命名规范:
1、以字母开头
2、使用下划线或中划线做单词的连接
3、同类型的使用数字区分
4、对于文件最好加上拓展名,如tar.gz;
设置变量:varname=value
删除变量 unset varname
变量有系统变量和环境变量
系统启动时会加载一下文件和目录下内容
/etc/profile
/etc/profile.d/
/etc/bashrc
/root/.bahsrc
/root/.bash-profile
在这些文件和目录里写入的变量,就会变成系统变量。
常用系统变量
PATH、PWD、LANG、HOME、HISTSIZE、PS1、IFS
全局变量和局部变量
[root@nginx ~]# local_var='local' [root@nginx ~]# export whole_var='whole' [root@nginx ~]# echo $local_var local [root@nginx ~]# echo $whole_var whole [root@nginx ~]# bash [root@nginx ~]# echo $local_var [root@nginx ~]# echo $whole_var whole
运算符
算术运算符主要有:+、-、*、/、%
关系逻辑运算符有:<、>、<=、>=、== 、!=
INTEGER1 -eq INTEGER2 INTEGER1 is equal to INTEGER2 ## == INTEGER1 -ge INTEGER2 INTEGER1 is greater than or equal to INTEGER2 #>= INTEGER1 -gt INTEGER2 INTEGER1 is greater than INTEGER2 #> INTEGER1 -le INTEGER2 INTEGER1 is less than or equal to INTEGER2 #<= INTEGER1 -lt INTEGER2 INTEGER1 is less than INTEGER2 #< INTEGER1 -ne INTEGER2 INTEGER1 is not equal to INTEGER2 # !=
赋值运算符:=、+=、*=、/=、%=
举例说明:
[root@nginx ~]# d=2 [root@nginx ~]# ((d+=3)) [root@nginx ~]# echo $d 5 [root@nginx ~]# ((d-=4)) [root@nginx ~]# echo $d 1 [root@nginx ~]# ((d*=12)) [root@nginx ~]# echo $d 12 [root@nginx ~]# ((d/=2)) [root@nginx ~]# echo $d 6 [root@nginx ~]# ((d%=4)) [root@nginx ~]# echo $d 2
if多分支
[root@nginx test]# vim check_file.sh #!/bin/bash var='/etc/passwd' if [ -d $var ] then echo '$var is directory' elif [ -b $var ] then echo '$var is block' elif [ -f $var ] then echo '$var is regular file' else echo '$var is unknow' fi
注意:[ -b $var ]的格式,必须有空格