1、cut字段提取命令
cut [选项] 文件名
选项:
-f 列号:提取第几列
-d 分隔符:按照指定分隔符分割列(不指定分隔符的话是默认采用制表符分隔)
实例1:提取用制表符制作的文件信息
实例2:提取系统中的普通用户名称(指定的分隔符为冒号)
cut命令的不足:cut命令不能截取用不等的空格隔开的数据
综上,cut命令适合于提取比较规则的文件或用制表符分隔的文件,使用起来很简单,但对于用空格分隔的文本,cut命令就很无力,此时就需要使用awk命令。而在使用awk命令之前,必须先得学会使用printf命令。
2、printf命令
printf命令与字符提取没有本质的关系,但是它是学习使用awk命令的基础,它是一种输出语句,并且是一种最原始的输出命令(毕竟linux内核是使用c语言写的)。
printf的基本语法:
printf '输出类型输出格式' 输出内容 #类似于c语言中的printf函数
输出类型有:
%ns: 输出字符串。n是数字指代输出几个字符
%ni: 输出整数。n是数字指代输出几个数字
%m.nf: 输出浮点数。m和n是数字,分别指代浮点数的总位数(包含小数点)与小数部分的位数
输出格式:
\a:输出警告声音
\b:输出退格键,也就是Backspace键
\f:清除屏幕
\n:换行
\r:回车,也就是Enter键
\t:水平输出退格键,也就是Tab键-\v:垂直输出退格键,也就是Tab键
prinf不支持数据流操作:即不能跟管道符一起使用
可见printf的操作比较原始,虽然这个命令很麻烦,但因为awk命令只能使用printf及print命令,不能识别echo命令,所以必须掌握,print与printf相比,输出内容时,不用人为的添加换行符 。
3、awk命令
awk命令是linux系统中一个非常复杂,功能强大的命令,甚至支持在命令中嵌套流程控制语句,以至于在市面上有专门讲awk命令的书籍,但作为linux系统管理来说,我们掌握它的基本的字符提取功能就ok了,其他知识等参加工作后再边查阅资料边应用足矣。
awk '条件1{动作1}条件2{动作2}...' 文件名
条件(pattern):
一般使用关系表达式作为条件
x>10判断变量x是否大于10
x>=10大于等于
x<=10小于等于
动作(action):
格式化输出
流程控制语句
实例1:提取用制表符分隔内容的文件文本
可见,在实现相同功能的情况下:cut命令要简便的多。
awk命令的执行原理:
awk虽然是个字段提取命令,但awk是这样处理的:
awk首先会将文件的第一行读取出来,然后再awk中判断条件,如果条件满足,则会执行相应的动作,上面的例子由于没有加条件,所以每一行都会执行同第一行一样的动作。这个动作首先执行的动作是,首先将文件名student.txt赋给$0,然后$1是第一个字段,$2是第二个字段……
然后第二行也重复第一行的动作,将相应字段的内容提取到对应字段中
实例:提取根分区硬盘使用占比
BEGIN条件
awk 'BEGIN{printf "This is a transcript \n"}{printf $2 "\t" $4 "\n"}' student.txt
BEGIN条件会在所有输出的内容之上,先输出"This is a transcript"
类似的END条件会在所有的内容后输出"This is a transcript"
不加BEGIN或END的话,输出结果为:
FS内置变量
cat /etc/passwd | grep "/bin/bash" | awk 'BEGIN{FS=":"}{printf $1 "\t" $3 "\n"}'
关系运算符:
#打印成绩大于70分的人员名单
cat student.txt | grep -v Name | awk '$4>=70{printf $2 "\n"}'
结果为:
4、字符替换命令sed
想让计算机自动替换文本,就不适合使用具有交互功能的vim等编辑器,sed命令就是这样一个再shell编程中自动替换文本的命令。sed命令是一种几乎包括在所有UNIX平台(包括linux)的轻量级流编辑器。sed主要是用来将数据进行选取、替换、删除、新增的命令。sed命令的格式为:
sed [选项] '[动作]' 文件名
选项:
-n:一般sed命令会把所有数据都输出到屏幕,如果加入此选项则只会把经过sed命令处理的行输出到屏幕。
-e:允许对输入的数据应用多条sed命令编辑
-i:用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出
动作:
a:追加,在当前行后添加一行或多行
c:行替换,用c后面的字符串替换原数据行
i:插入,在当前行前插入一行或多行。
d:删除,删除指定的行
p:打印,输出指定的行
s:字串替换,用一个字符串替换另外一个字符串。格式为:"行范围s/旧字串/新字串/g"(和vim中的替换格式类似)
实例1:打印student.txt文件第二行的数据(注意加了-n与没加-n的区别)
实例2:删除student.txt文件第二行到第四行的数据,但不修改文件本身
实例3、在第二行前或第二行后加入数据
实例4、行替换c
字符串替换:
sed 's/旧字串/新字串/g' 文件名
sed -e 's/fengji//g;s/cang//g' student.txt
#同时把"fengj"和"cang"替换为空
实例5、字串替换s
实例6、-i可以改变原始文件内容