阅读量: 75
字符串处理
一、字符串处理
假设有变量 url="http://www.wouniuxy.com/index/html",以下用法及结果输出
*// 从左边开始删除第一个 // 号及左边的所有字符:
echo ${url#*//} 输出结果:www.wouniuxy.com/index/html
##*/ 表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符:
echo ${url##*/} 输出结果:index.html
%/* 表示从右边开始,删除第一个 / 号及右边的字符:
echo ${url%/*} 输出结果:http://www.wouniuxy.com
%%/* 表示从右边开始,删除最后(最左边)一个 / 号及右边的字符:
echo ${url%%/*} 输出结果:http:
假设有变量:phone="18812345678",利用 : 进行字符串截取:
echo ${phone:0:5} 从第一个位置开始往后截取五个字符,输出为:18812
echo ${phone:6} 从第七个位置开始往后直到结束,输出为:45678
echo ${phone:0-7:5} 从右边第七个字符开始,截取五个,输出为:23456
echo ${phone:0-7} 从右边第七个字符开始,直到结束,输出为:2345678
echo ${#phone} 取得phone的字符数量,即字符串长度
二、AWK
-
对文本进行逐行处理的编程语言,与sed和grep很相似,awk是一种样式扫描与处理工具,但其功能却强于sed和grep。
awk 选项 处理逻辑 文件或文本 #如果要针对命令执行结果进行过滤,则必须使用管道
echo "Hello wouniuxy Welcome chengdu" | awk '{print $2}' #按照空格隔开,并输出第二列内容:woniuxy
echo -e "Hello wouniuxy Welcome chengdu\nA B C D" | awk '{print $2}'
wouniuxy
B
从awk的处理视角来看,任意一段文本,均可以按照行列(二维表)的形式进行理解
查找/etc/passwd下面第一个域为root的行并将其第一个域打印出来(-F : 表示以冒号分隔域)
awk -F : '$1~/root/ {print $1}' /etc/passwd
查找/etc/passwd中不包含root的行并统计一共有多少行
awk -F : 'BEGIN {sum=0} $0!~/root/ {sum+=1} END {print sum}' /etc/passwd
文件etc/passwd中如果第一个域包含root则打印它,否则打印第三个域的值
awk -F : '{if($1=="root") print $1; else print $3}' etc/passwd
打印文件中不包含bin或者root的行(特别的$0表示整行)
awk -F : '$0!~/(bin|root)/' /etc/passwd
查找进程中包含yes的进程并打印出其cpu使用率
top -d 1 | awk '$0~/yes/ {print $10}'
ps -aux|sort -k 3 -r|head -n 5|awk '{printf "%-10s %-10s\n", $2, $3}'
cpu=top -n 1 | grep "^%Cpu" | awk -F " " '{print int($8)}'
通过ping www.woniuxy.com -c 1 结合awk或其它知识,输出woniuxy,com的IP地址(不能有其他内容)
ping www.wouniuxy.com -c 1 | grep ^PING | awk -F [\(\)] '{print $2}'
ping www.wouniuxy.conm -c 1 | grep icmp_seq | awk '{print $4}'
# 如果没有规则可以grep的情况下,则head和tail联合使用来定位具体的行
ping -c 1 www.wouniuxy.com | head -n 2 | tail -n 1
查找/etc/passwd中不包含root的行并统计一个有多少行
awk -F : 'BEGIN {sum=0} $0!~/root/ {sum+=1} END {print sum}' /etc/passwd
文件/etc/passwd中如果第一个域包含root则打印它,否则打印第三个域的值
awk -F : '{if ($1=="root") print $1 ; else print $3}' /etc/passwd
打印/etc/passwd中不包含root或者home的行(特别的$0表示整行)
awk -F : '$!~/(home|root)/' /letc/passwd
查找进程中包含yes的进程并打印出其cpu的使用率
top -n 1 | awk '%0~/yes/ {print $10}'
三、sed
1. sed的基本用法
- 常用的三个选项:
- -e 指定脚本或进行多点编辑
- -n 显示处理后的结果
- -i 用就将编辑保存到指定文件中
- 常用的6个动作:
- a:新增,a的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
- c:取代,c的后面可以接字串,这些字串可以取代n1,n2之间的行
- d:删除,因为是删除,所以d后面通常不接任何字符串
- i:插入,i的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
- p:打印,将某个选择的数据打印出。通常p会与参数sed -n一起运行
- s:取代,可以直接进行取代的工作,通常这个s的动作可以搭配正则表达式进行
2. 示例
head /etc/passwd > test.txt 先准备一份简单的文本文件
sed '5a Hello wouniu' test.txt 在第5行后面太年间Hello wouniu的新行
sed '5i Hello chengdu' test.txt 在第5行前面太你家Hello chengdu的新行
sed '2d' test.txt 删除第2行
sed '2,5d' test.txt 删除第2行到第5行
sed '2.5c Goooood' test.txt 将第2行到第5行的内同替换为Goooood
sed -n '/root/p' test.txt 删除包含root的行
sed -e '' -e '' -e '' 多点编辑
sed -i '4a Hello' test.txt 直接修改文件,永久生效