数据都存储在文件中,文件中肉眼可见的数据无非就是各种有规则的字符的组合,比如日志文件,小文件我们还可以认真阅读,但是给你一个10M大小的数据文件,不亚于阅读一本小说,更何况密密麻麻都是数据,我们可以通过cut、awk、sed这三个命令从规则文件中提取符合我们需要的数据,重要的是他们的运行速度非常的块。
cut命令通常对数据进行“列”的提取操作,就好比关系型数据库中对列数据提取。
语法:cut [选项] [file]
选项:
-d ,表示指定分隔符-f ,表示指定截取区域-c ,表示以字符为单位进行分割注意:不加-d选项,默认为制表符,不是空格
我们一用户信息为例进行讲解,下图是系统用户信息
例1:
以 ':' 为分隔符,截取/etc/passwd的第一列跟第三列cut -d ':' -f 1,3/etc/passwd
例2:
以 ':' 为分隔符,截取出/etc/passwd的第一列到第三列cut -d ':' -f 1-3/etc/passwd
例3:
以 ':' 为分隔符,截取出/etc/passwd的第二列到最后一列cut -d ':' -f 2- /etc/passwd
例4:
截取/etc/passwd文件从第二个字符到第九个字符cut -c 2-9 /etc/passwd
例5:
比如领导想叫你截取linux上面所有可登录普通用户
cat /etc/passwd | grep '/bin/bash' | cut -d ':' -f 1 | grep -v root
注意,cut命令缺点是不能以空格作为分隔符。可以使用下文讲解的awk命令。
2.awk命令,自由控制行列,且很容易
awk一个非常强大的数据处理命令,支持条件判断,数组,循环等功能,与grep,sed被称为linux三剑客。awk通常对数据进行列的提取,它先一行一行的按行读取数据,然后再按列提取数据。
语法:
awk '条件1 {执行动作} 条件2 {执行动作} ' 文件名
或 awk [选项] '条件1 {执行动作} 条件2 {执行动作} ' 文件名
注意,条件是可以省略的,一定要记住。
在举例前,先介绍其他两个命令:printf,格式化输出,不会自动换行;print,打印出内容,默认会自动换行,%s 代表字符串,\t 代表制表符,\n 代表换行符。
比如,
printf '%s\t%s\t%s\t%s\t%s\t%s\n' 1 2 3 4 5 6
awk的一些特殊要点与举例说明NR,表示行号
$1,代表第一列
$2,代表第二列
$NF,代表最后一列
-F ,表示指定分割符
例1:
awk '{print $1}' /etc/passwd,这条命令意思是打印/etc/passwd文件的第一列,{print $1}表示执行动作,根据awk的语法,我们并没有添加条件,awk默认把一整行当成一列,如下图
我们需要awk根据“:”进行分隔,使用如下命令:
awk -F ':' '{print $1}' /etc/passwd
或者
cat /etc/passwd | awk -F ':' '{print $1}'
例2:处理空格
df -h | awk '{print $4}',默认以空格进行分隔,不需要-F参数
例3:打印第一行第一列
df -h | awk 'NR==1 {print $1}'
例4:打印第二行到第五行的第一列
df -h | awk '(NR>=2 && NR <=5) {print $1}'
例5:打印最后一列
df -h | awk '{print $NF}'
BEGIN参数:在读取所有行内容前就开始执行,一般用来初始化操作
例6:
解读:在打印每行第一列之前,先将每行按分隔符“:”进行分隔。
例7:
df -h | grep -v 'Filesystem' | awk '{printf $1} {printf "文件系统使用率:"} {print $5}'
解读:打印文件系统的使用率,格式为第一列+“文件系统使用率”+ 使用百分比
或者,我们加一个标题“文件系统使用情况”
df -h | grep -v 'Filesystem' | awk 'BEGIN {printf "文件系统使用情况:\n \n"} {printf $1}{printf "文 件系统使用率:"} {print $5}'
END,结束的时候执行
df -h | grep -v 'Filesystem' | awk 'BEGIN {printf "文件系统使用情况:\n \n"} {printf $1}{printf "文件系统使用率:" } {print $5} END {printf "一切正常 \n"}'
3.sed命令
sed命令主要对数据进行处理(选取,新增,替换,删除,搜索)。
语法:sed [选项] [动作] 文件名
下文列子还是以df -h为基础进行讲解。
常见的选项与参数:
-n,把匹配到的行输出打印到屏幕
p,以行为单位进行打印,通常与-n一起使用
例1:打印第二行内容
df -h | sed -n '2p'
d ,删除行
例2:将打印内容的第二行删除
df -h | sed '2d'
a ,在行的下面插入新的内容
例3:在第2行下面插入1234567890
df -h | sed '2a 1234567890'
i ,在行的上面插入新的内容
例3:在第2行上面插入1234567890
df -h | sed '2i 1234567890'
c ,替换
例3:将1234567890替换第2行内容
df -h | sed '2c 1234567890'
指定字符串替换:s/要被取代的内容/新的字符串/g ,指定内容进行替换,s/表示要匹配的内容,/g表示结束的意思,这个工作中常用
例4:经'centos-root'替换为'科技狂徒’
df -h | sed 's/centos-root/科技狂徒/g'
-i ,对源文件进行修改(高危操作,慎用,用之前需要备份源文件
例5:将文件中的'cong'替换为'科技'
sed -i 's/cong/科技/g' 123.txt
-n,在文件中搜索内容
例6:搜索文件中包含‘zh’的行,并打印出来
sed -n '/zh/p' 123.txt