Linux下有文本处理三剑客 -- grep sed awk
grep:文本 行过滤工具
sed: 文本 行编辑器(流编辑器)
awk:报告生成器(做文本输出格式化)
一、正则表达式
1、基础正则表达式
* 匹配前一个字符0次或任意多次 (a*表示匹配前一个字符0次或任意多次,这样写没有任何意义,会匹配所有。aa*表示匹配至少包含一个a的行)
. 匹配除了换行符外任意一个字符
^ $ 行首和行尾
[ ] 中括号中任意一个字符
\{n\} 表示前面的字符恰好出现n次 \是转义符
\{n,\} 表示其前面的字符出现不小于 n 次
\{n,m\} 表示前一个字符至少出现n次,最多出现m次
2、扩展正则
不需要加转义符
+ 前一个字符匹配1次或任意多次
? 前一个字符匹配0次或1次
| 匹配两个或多个分支选择
() 匹配一个整体
二、字符截取和替换命令
1、cut
cut 命令的默认分隔符是制表符,也就是“tab”键
-f 列号
-d 分隔符
-c 字符范围
2、awk
常见参数
-F 指定分隔符
-v 手动指定变量参数
1)printf格式化输出
printf ‘输出类型输出格式’ 输出内容
输出类型: %ns: 输出字符串。n 是数字指代输出几个字符
%ni: 输出整数。n 是数字指代输出几个数字
%m.nf: 输出浮点数。m 和 n 是数字,指代输出的整数位数和小数位数。如%8.2f 代表共输出 8 位数,
其中 2 位是小数,6 位是整数。
+右对齐
-左对齐
例子:
查看系统中的id大于等于1并小于等于500的用户
cat /etc/passwd |awk 'BEGIN{FS=":"} $3>=1&&$3<=500{printf "%-10s %-10d\n",$1,$3}'
2)awk基本使用
awk ‘条件 1{动作 1} 条件 2{动作 2}…’ 文件名
例如:df -h|grep /dev/sda3|awk '{print $5}' 提取根分区占有率
3)awk的条件
BEGIN 在 awk 程序一开始时,尚未读取任何数据之前执行。BEGIN后的动作只在程序开始时执行一次
END 在 awk 程序处理完所有数据,即将结束时执行。END 后的动作 只在程序结束时执行一次
> >= < <= == !=
A~B 判断字符串 A 中是否包含能匹配 B 表达式的子字符串
A!~B 判断字符串 A 中是否不包含能匹配 B 表达式的子字符串
/正则/
4)awk的内置变量
$0 代表目前 awk 所读入的整行数据。我们已知 awk 是一行一行读入数据 的,$0 就代表当前读入行的整行数据
$n 代表目前读入行的第 n 个字段。
NF 当前行拥有的字段(列)总数。
NR 当前 awk 所处理的行,是总数据的第几行。
FS 用户定义分隔符。awk 的默认分隔符是任何空格,如果想要使用其他 分隔符(如“:”),就需要 FS 变量定义
OFS 输出字段的分隔符(默认为空格)。
例子:统计历史命令使用次数最多的
history |awk -F '[ ]+' '{print $3}'|sort|uniq -c|sort -nr|head
3、sed
sed 主要是用来将数据进行选取、替换、删除、新增的命令
sed [选项] ‘[动作]’ 文件名
选项:
-n 一般 sed 命令会把所有数据都输出到屏幕,如果加入此选择,则只会把经过 sed 命令处理的行输出到屏幕。
-r 在 sed 中支持扩展正则表达式
-i 用 sed 的修改结果直接修改读取数据的文件,而不是由屏幕输出
动作:
a \: 追加,在当前行后添加一行或多行。添加多行时,除最后 一行外, 每行末尾需要用“\”代表数据未完结。
c \: 行替换,用 c 后面的字符串替换原数据行,替换多行时,除最后一行 外,每行末尾需用“\”代表数据未完结。
i \: 插入,在当期行前插入一行或多行。插入多行时,除最后 一行外, 每行末尾需要用“\”代表数据未完结。
d: 删除,删除指定的行。
p: 打印,输出指定的行
s: 字串替换,用一个字符串替换另外一个字符串。格式为“行范围 s/ 旧字串/新字串/g”(和 vim 中的替换格式类似)
三、字符处理命令
1、sort
sort [选项] 文件名
-f: 忽略大小写
-b: 忽略每行前面的空白部分
-n: 以数值型进行排序,默认使用字符串型排序
-r: 反向排序
-u: 删除重复行。就是 uniq 命令
-t: 指定分隔符,默认是分隔符是制表符
-k n[,m]: 按照指定的字段范围排序。从第 n 字段开始,m 字段结束(默认到行尾)
2、uniq
uniq [选项] 文件名
-i: 忽略大小写
3、wc
-l: 只统计行数
-w: 只统计单词数
-m: 只统计字符数
-L:统计单词字符数
四、条件判断
1、按照条件进行判断
test
-d 判断目录是否存在
-e 判断文件是否存在
-f 判断是否为普通文件
-s 判断文件是否为空
2、按照文件权限判断
-r
-w
-x
-u 判断是否有suid权限
-g 判断是否有sgid权限
-k 判断是否有sbit权限
3、两文件之间的判断
文件1 -nt 文件2 判断文件 1 的修改时间是否比文件 2 的新(如果新则为真)
文件 1 -ot 文件 2 判断文件 1 的修改时间是否比文件 2 的旧(如果旧则为真)
文件 1 -ef 文件 2 判断文件 1 是否和文件 2 的 Inode 号一致,可以理解为两个文件是否 为同一个文件。这个判断用于判断硬链接是很好的方法
4、整数判断
-eq 等于
-gt 大于
-ge 大于等于
-lt 小于
-le 小于等于
5、字符串判断
-z 判断字符串是否为空(为空返回真)
-n 判断字符串是否为非空(非空返回真)
== 判断字符串 1 是否和字符串 2 相等(相等返回真)
!= 判断字符串 1 是否和字符串 2 不相等(不相等返回真)
6、多重条件判断
判断 1 -a 判断 2 逻辑与,判断 1 和判断 2 都成立,最终的结果才为真
判断 1 -o 判断 2 逻辑或,判断 1 和判断 2 有一个成立,最终的结果就为真
!判断 逻辑非,使原始的判断式取反
五、流程控制
1、单分支if
if [ ];then
执行体
fi
2、双分支if
if [ ];then
条件成立执行
else
条件不成立执行
fi
3、多分支if
if [ ];then
条件成立执行
elif [ ];then
条件成立执行
else
所有条件不成立执行
fi
4、多分支case条件语句
case只能判断一种条件关系,而if可以判断多种
case 变量 in
值1)
执行体
;;
值2)
执行体
;;
*)
如果变量都不是以上的值,则执行此
;;
esac
5、for循环
for i in 条件 ; do
循环体
done
for((初始值;循环控制条件;变量变化))
do
循环体
done
6、while循环
while [ 条件判断 ];do
done