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"选项一致
\eescape键
\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视频课程学习笔记

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值