shell编程基础-文本处理

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

猜你喜欢

转载自blog.csdn.net/yangshihuz/article/details/111032511