字符串处理

字符串处理

一、字符串处理

假设有变量 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

  • 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            直接修改文件,永久生效
上一篇
下一篇