cut
处理文本的列字符串,grep是针对处理行
- -f n :提取n列,或者-f n,m 提取n和m列(默认tab为列分隔符)
- -d :以什么分隔符为列(可以自定义分隔分)
cut -f 2 /etc/passwd
#全部打印,问题是分隔分默认是tab键
cut -d ":" -f 2 /etc/passwd
cut -d : -f 2,4 /etc/passwd
#打印出第二列或者下面的第二列和第四列,2,4不是2-4的范围
cut缺点是不支持空格为分隔符,需要支持就要使用awk
awk编程
处理文本列字符串,处理是按照行
格式:awk ‘条件1 {动作1} 条件2 {动作2} …’
条件(不加条件就是所有列)
- BEGIN:执行动作之前处理
- END:执行动作之后处理
- 大于>,大于等于>=
- 小于<,小于等于<=
- 等于==
- 包含 ~ (awk识别字符串需要/abc/)
- 不包含 !~ (awk识别字符串需要/abc/)
- 正则规则 //
动作
- printf输出并且也支持print,区别就是print后自动换行
- 流程控制语句
内置变量
- $0,所有列
- $n,第n列
- NF:列的总数
- NR:行号
- FS:指定分隔符
awk默认是以空格和tab为列分隔符
变量需要在引号外面
df -h | awk '{print $5}'
#支持空格分隔符输出列
cat /etc/passwd | awk '{FS=":"} {print $1}'
#问题是第一行被全部打印了,因为awk是先读取行再进行处理,第一行已经来不及识别分隔符
cat /etc/passwd | awk 'BEGIN {FS=":"} {print $1}'
#已分隔符为:读取第一列
df -h | awk '{print $5}' | cut -d % -f 1 | grep -v U
#获取第5列的磁盘容量值
df -h | awk '$1 ~ /root/ {print $5}'
#打印第一列包含root字符串,打印第5列
sed
修改文本的数据,添加、删除、插入、替换
格式:sed 选项 动作
选项
- -n:不加-n就是输出全部内容,加-n后输出指定内容
- -e:允许多条动作,分号为分隔符
- -i:修改文件,而不是打印输出,不加i是不会修改文件内容的
- -r:支持扩展正则
动作(多行加 \)
- p :打印输出
- a :追加,指定行的后一行
- -i : 插入,指定行的前一行
- -c :替换行
- -d :删除行
- -s :替换字符串,格式:‘行 s/旧数据/新数据/g’
字符串删除需要借用替换,新数据为空
sed -i 's/#SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
#修改关闭selinux
sed '/^#/d' /etc/selinux/config
#删除带有#号的行,正则需要加//
sed -e '/^#/d ; 1a 11111' /etc/selinux/config
#执行多条命令,先删除后添加
sort 排序
- f 忽略大小写
- -n 以整数排序,默认为字符串
- -r 反向排序
- -u 去除重复行
- -t 指定分隔符,-k指定范围
sort /etc/passwd
#以第一个字符开始排序
sort -n -t : -k 3 /etc/passwd
#第三列以数值进行排序
wc统计
- -i 统计行数量
- -w 统计单词数
- -m 统计字符数
[root@localhost ~]# wc -lwm /etc/passwd
27 51 1301 /etc/passwd
#27行 51单词 1301字符数
条件判断
test命令或者[ ]中括号(判断是否为真,$?输出)
格式:[ 选项 文件]
选项:按照文件类型判断(默认为真)
- -b 文件:判断文件是否存在,并且为块设备
- -c 文件:判断文件是否存在,并且为字符设备
- -d 文件:判断文件是否存在,并为目录文件
- -e 文件:判断文件是否存在
- -f 文件:判断文件是否存在,并为普通文件
- -L 文件:判断文件是否存在,并为符号链接文件
- -p 文件:判断文件是否存在,并为管道文件
选项:按照文件权限判断(默认为真)
无法区分所属者和所属组和其他
- -r 文件:判断文件是否存在,并且文件读权限
- -w 文件:判断文件是否存在,并且文件写权限
- -x 文件:判断文件是否存在,并且文件执行权限
- -u 文件:判断文件是否存在,并且文件SUID权限
- -g 文件:判断文件是否存在,并且文件SGID权限
- -k 文件:判断文件是否存在,并且文件SBit权限
选项:文件之间时间比较(默认为真)
- 文件 1 -nt 文件 2 :文件1是否比文件2新
- 文件 1 -ot 文件 2 :文件1是否比文件2旧
- 文件 1 -ef 文件 2 :文件1和文件2indode号是否一样
选项:整数之间比较(默认为真)
- 整数 1 -eq 整数 2 :等于
- 整数 1 -ne 整数 2 :不等于
- 整数 1 -gt 整数 2 :大于
- 整数 1 -lt 整数 2 :小于
- 整数 1 -ge 整数 2 :大于等于
- 整数 1 -le 整数 2 :小于等于
选项:字符串之间比较(默认为真)
- 字符串 1 == 字符串 2 :等于
- 字符串 1 != 字符串 2 :不等于
- -z 字符串:为空
- -n 字符串:为非空
选项:多条件判断(默认为真)
- 判断 1 -a 判断 2 :与
- 判断 1 -o 判断 2 :或
- !判断:非,取反
[ 10 -eq 12 ]
[root@525 ~]# echo $?
1
或
[ 10 -eq 12 ] && echo yes || echo no
no