Shell基础(六)字符串处理
cut列提取命令
命令格式:
[root@localhost ~]# cut [选项] 文件名
选项:
- -f 列号:提取第几列
- -d 分隔符:按照指定分隔符分割列
- -c:字符范围:不依赖分隔符来区别,而是通过字符范围(行首为0)来进行字段提取。"n-"表示从第n个字符到行尾,“n-m"表示从第n个字符到第m个字符;”-m"表示从第1个字符到第m个字符。
注:cut的默认分隔符是制表符,也就是Tab键。
例:
[root@localhost ~]# cut -f 2 test.txt #提取第二列
gender
m
w
[root@localhost ~]# grep "root" /etc/passwd -v | grep "/bin/bash" | cut -f 1 -d : #搜索root之外的用户
u1
u2
u3
wszd158
awk编程
概述
AWK是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。
printf格式化输出
命令格式:
[root@localhost ~]# printf '输出类型输出格式' 输出内容
输出类型:
%ns:输出字符串,n是表示输出几个字符。
%ni:输出整数,n是指输出几个数字。
%m.n:输出浮点,m和n是数字。
输出格式:
转义字符 | 含义 |
---|---|
\ | \ |
\a | 警告音 |
\b | 向左删除 |
\c | 取消输出行末的换行符,和"-n"选项一致 |
\e | escape键 |
\f | 换页符 |
\n | 换行符 |
\r | 回车键 |
\t | 制表符,也就是Tab键 |
\v | 垂直制表符 |
\0nnn | 按照八进制输出ASCII表字符,nnn表示三位八进制数 |
\xhh | 按照十六进制输出ASCII表字符,hh表示两位十六进制数 |
例:
- printf输出文件内容
[root@localhost ~]# printf '%s' $(cat mail)
#printf无法直接将文件作为参数处理,所以这里用cat读取文件内容
awk基本使用
命令格式:
[root@localhost ~]# awk '条件1{动作1} 条件2{动作2}...'
条件:一般使用关系表达式作为条件,条件成立则执行动作。
动作:格式化输出、流程控制语句。
- 例:用awk处理以空格作为间隔的文本
[root@localhost ~]# df -h | awk '{print $1}'
文件系统
devtmpfs
tmpfs
tmpfs
tmpfs
/dev/sda2
/dev/sdb2
/dev/sda1
tmpfs
- 提取时去掉百分号,把百分号当作分隔符。
[root@localhost ~]# df -h | grep "/dev/sda1" | awk '{print $5}' | cut -d % -f 1
95
BEGIN
BEGIN是awk的保留字,是一种特殊的条件类型,BEGIN的执行时机是"在awk程序一开始时,尚未读取任何数据之前执行"。
[root@localhost ~]# df -h | grep "/dev/sda1" | awk 'BEGIN{print"welcome to awk! "}{print $5}'
welcome to awk!
95%
#在执行前显示"welcome to awk! "
END
END也是awk的保留字,是在awk处理完所有数据,即将结束时执行,END后的动作只在程序结束时执行一次。
[root@localhost ~]# df -h | grep "/dev/sda1" | awk 'END{print"byebye! "}{print $5}'
95%
byebye!
数据传输
当将数据导入时,把一行的数据赋予$0,第一列的数据赋予$1,第二列的数据赋予$2,以此类推。
识别某个字段
当字符匹配时,需要使用到常用的关系运算符,如大于小于等,以及之前没有涉及到的包含匹配。
- A~B:搜索字符A中是否包含B表达式的子字符串。
- A!~B:判断字符串A中是否不包含能匹配B表达式的子字符串。
awk '$2 ~ /abc/ {printf $6 "\n"}' test.txt
#如果第二字段中含有"abc"字符,则打印第六字段数据
注:字符串必须包含在"//"中,awk命令才会正确识别。
正则表达式
再次强调,字符串必须包含在"//"中,awk才能正确识别。
awk '/abc/ {print}' test.txt
#在文本中查找包含字符"abc"的一行,并输出
常用的awk内置变量
- $0:代表当前读行的整行数据。
- $n:代表目前读入行的第n个字段。
- NF:当前行拥有的字段(列)总数。
- NR:当前awk所处理的行,是总数据的第几行。
- FS:用户定义分隔符,awk的默认分隔符是任何空格,如果想要使用其他分隔符,就需要FS变量定义。
[root@localhost ~]# grep "wjl" test.txt | awk 'BEGIN{FS="\t"} { print $1"\t列数:"NF}'
wjl 列数:2
#开始时将"\t"设为分隔符,输出有wjl的一行的第一列,以及这行的列数
sed字符串处理
在我们日常生活中处理文本信息时可以用vim,但电脑通过脚本处理文本信息用vim则显得太过复杂,因为这种交互比较难实现,这时候就可以用sed命令来处理文本数据。
基本使用
命令格式:
sed [选项] '[动作]' 文件名
选项:
- -n:一般sed会将所有数据输出到屏幕,加入此选项只会输出所处理过的行。
- -e:允许对输入数据应用多条sed命令编辑。
- -f 脚本文件名:从sed脚本中读入sed操作,和awk命令的-f非常类似。
- -r:在sed中支持拓展正则表达式。
- -i:用sed的修改结果直接修改读取数据的文件。
动作(一般动作不会修改文件,需要用选项"-i"。):
- a \:追加,在当前行后添加一行或多行,添加多行时,除最后一行外,每行末尾需要用""代表数据未完结。
- c \:行替换,用c后面的字符串替代原数据行,替换多行时,除最后一行外,每行末尾用""代表数据未完结。
- i \:插入,在当前行前插入一行或多行,插入多行时,除最后一行外,每行末尾需要用""代表数据未完结。
- d:删除,输出指定的行。
- p:打印,输出指定的行。
- s:字串替换,用一个字符串替换另一个字符串,格式为"行范围s/旧字串/新字串/g",这条命令也可以用来删除字符串。
实例
字符串替换:
[root@localhost ~]# sed -i 's/wjq/cls/g' test.txt
[root@localhost ~]# cat test.txt
name gender
wjl m
cls w
qjp m
jzy m
zjb m
追加:
[root@localhost ~]# sed -i "3a zjb\tm" test.txt
[root@localhost ~]# cat test.txt
name gender
wjl m
wjq w
zjb m
删除第一行:
[root@localhost ~]# sed "1d" test.txt
wjl m
wjq w
字符处理命令
排序命令
sort [选项] 文件名
选项:
- -f:忽略大小写。
- -b:忽略每行前面的空白部分。
- -n:以数值型进行排序,默认使用字符型排序。
- -r:反向排序。
- -u:删除重复行,就是uniq命令。
- -t:指定分隔符,默认分隔符是制表符。
uniq命令
uniq命令是用来取消重复行的命令。
uniq [选项] 文件名
选项:
- -i:忽略大小写。
统计命令wc
命令格式:
wc [选项] 文件名
常用选项:
- -l:只统计行数。
- -w:只统计单词数。
- -m:只统计字符数。
ps:尚硅谷linux视频课程学习笔记