正则表达式和文本处理工具二
一:整理博客,内容包含awk、变量、运算符、if多分支
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
-F 定义字段分隔符,默认的分隔符是连续的空格或制表符
使用option中的-F参数定义间隔符号
用$1,$2,$3等的顺序表示files中每行以间隔符号分隔的各列不同域
NF变量表示当前记录的字段数
-v 定义变量并赋值 也可以借用次方式从shell变量中引入
定址方法: 正则,变量,比较和关系运算
正则需要用//包围起来
^ 行首
$ 行尾
. 除了换行符以外的任意单个字符
* 前导字符的零个或多个
.* 所有字符
[] 字符组内的任一字符
[^] 对字符组内的每个字符取反(不匹配字符组内的每个字符)
^[^] 非字符组内的字符开头的行
[a-z] 小写字母
[A-Z] 大写字母
[a-Z] 小写和大写字母
[0-9] 数字
\< 单词头 单词一般以空格或特殊字符做分隔,连续的字符串被当做单词
\> 单词尾
AWK变量
NR变量定址
NR 表示AWK读入的行数
FNR表示读入行所在文件中的行数
NR 当前记录的个数(全部文件连接后的统计)
FNR 当前记录的个数(仅为当前文件的统计,非全部)
FS 字段分隔符 默认为连续空格或制表符,可以使用多个不同的符号做分隔符 -F[:/]
OFS 输出字符的分隔符 默认是空格
运算符
+ - * / % ++ --
转义序列
\\ \自身
\$ 转义$
\t 制表符
\b 退格符
\r 回车符
\n 换行符
\c 取消换行
if是条件判断语句,只有if的条件成立(表达式的值为真)后,才会执行if部分的代码,否则将会执行else的代码。如果是if... if,则必须满足第一个if同时满足第二个if,才会执行后面的代码。
Linux Shell : Test命令参数解析
test -z string : string 为空
test int1 -eq int2 : int1 == int 2
test int1 -ne int2 : int1 != int2
test int1 -gt int2 : int1 > int2
test int1 -ge int2 : int1 >= int2
test int1 -lt int2 : int1 < int2
test int1 -le int2 : int1 <= int2
test -w filename : 用户对文件filename有写权限
test -x filename : 用户对文件filename有可执行权限
test -f filename : 文件filename为普通文件
test -d filename : 文件filename为目录
test -c filename : 文件filename为字符设备文件
test -b filename :文件filename为块设备文件
test -s filename : 文件filename大小不为零
test -t fnumb : 与文件描述符fnumb(默认值为1)相关的设备是一个终端设备
test -o : Or
二:awk文本处理
打印uid在30~40范围内的用户名。
#awk -F: '$3 >=30 && $3 <= 40{print $1}' aa.txt
打印第5-10行的行号和用户名
#awk -F: 'NR >= 5 && NR <= 10{print NR,"---",$1}' aa.txt
打印奇数行
#awk -F: 'NR%2==1{print NR,"---",$0}' aa.txt 或 #awk -F: 'NR%2{print NR,"---",$0}' aa.txt
打印偶数行
#awk -F: 'NR%2==0{print NR,"---",$0}' aa.txt
打印字段数大于5的行
#awk -F: 'NF>5{print $0}' aa.txt
打印UID不等于GID的用户名
#awk -F: '$3!=$4{print $1}' aa.txt
打印没有指定shell的用户
#awk -F '/nologin$/{print $1}' aa.txt