Linux操作系统:字符串处理及awk与sed

目录

  • 一、字符串处理
  • 二、AWK
  • 三、sed

一、字符串处理

假设有变量ur1="http://www.woniuxy.com/index.htm7",以下用法及结果输出

*// 从左边开始删除第一个//号及左边的所有字符:
echo ${ur1#*//}
输出结果:www.woniuxy.com/index.html

##*/ 表示从左边开始删除最后(最右边〉一个/号及左边的所有字符:echo ${ur1##*/}
输出结果:index.html

%/* 表示从右边开始,删除第一个/号及右边的字符:
echo ${url%/*}
输出结果:http://www.woniuxy.com

%%/*表示从右边开始,删除最后〈最左边〉一个/号及右边的字符:echo ${url%%/*}
输出结果:http:

假设有变量:phone="18812345678",利用 : 进行字符串截取:
echo ${phone:0:5}从第1个位置开始往后截取5个字符,输出为:18812
echo ${phone: 6}
从第7个位置开始往后直到结束,输出为:45678
echo ${phone:0-7:5} 
从右边第7个字符开始,截取5个,输出为:23456
echo ${phone:0-7}从右边第7个字符开始,直到结束,输出为:2345678
echo ${#phone}
取得phone的字符数量,即字符串长度

实例:
1、[root@numberone ~]# url="http://www.baidu.com"
[root@numberone ~]# echo $url在这里插入图片描述
2、[root@numberone ~]# echo ${url#*//}
输出删除//左边的部分
Linux操作系统:字符串处理及awk与sed_第1张图片
3、[root@numberone ~]# echo ${url##*/}
从左边开始到最右边删除最后一个/号及左边的所有字符
Linux操作系统:字符串处理及awk与sed_第2张图片
4、[root@numberone ~]# phone="12345678"
[root@numberone ~]# echo ${phone:0:5}
12345
[root@numberone ~]# echo ${phone:2:5}
34567
[root@numberone ~]# echo ${phone:5}
678
[root@numberone ~]# echo ${phone:0-3:2}
67
[root@numberone ~]# echo ${phone:0-5:4}
4567
[root@numberone ~]# echo ${#phone}
8
Linux操作系统:字符串处理及awk与sed_第3张图片

二、AWK

对文本进行逐行处理的编程语言,它来源于3个创作者的名字: Aho、(Peter)Weinberg和(Brain)Kernighan,与sed和grep很相似,awk是—种样式扫描与处理工具,但其功能却强于sed和grep。

awk 选项 处理逻辑 文件或文本  #如果要针对命令执行结果进行过滤,则必须使用管道


echo "Hello woniuxy we1come Chengdu" | awk '{print $2}' #按照空格隔开,并输出第2列的内容:woniux

echo -e "Hello woniuxy welcome Chengdu \nA B C D" | awk '{print $2}'
woniuxy
B
从awk的处理视角来看,任意一段文本,均可以按照行列(二维表)的形式进行理解

要有列的视角,分隔符至关重要
echo "http://www.woniuxy.com/index.html" | awk '{print $2}' #无第2列
echo "http://www.woniuxy.com/index.html" | awk -F . '{print $2}' # woniuxy
echo "http://www.woniuxy.com/index.html" | awk -F / '{print $3}'# www.woniuxy. com
echo "http://ww.woniuxy.com/index. html" | awk -F [/.] '{print $3}’# www,同时以/或.作为分隔符

查找/etc/passwd下面第一个域为root的行并将其第一个域打印出来((-F︰表示以冒号分隔域)
awk -F : '$1~/root/ {print $1}' /etc/passwd

通过 ping www.woniuxy.com -c 1 结合awk或其他已经学习过的知识,输出woniuxy.com的IP地址〈不能有其他内容)
ping www.woniuxy.com -c 1 | grep ^PING / awk -F [\(\)] '{print $2}'
ping www.woniuxy.com -c 1 | grep icmp_seq / awk '{print $4}'
ping www.woniuxy.com -c 1 | awk '$4~/^[0-9]*\.[O-9]*\./ {print $4}'
#如果没有规则可以grep的情况下,则head和tai1联合使用来定位具体的行
ping -c 1 www. woniuxy.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

打印文件中不包含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)}'`

1、[root@numberone ~]# echo "Hello friend welcome world" | awk '{print $2}'
friend
在这里插入图片描述
[root@numberone ~]# echo "Hello friend welcome world" | awk '{print $0}'
Hello friend welcome world
[root@numberone ~]# echo "Hello friend welcome world" | awk '{print $1}'
Hello在这里插入图片描述
[root@numberone ~]# echo -e "Hello friend welcome world\n A B C D" | awk '{print $2}'
friend
B
Linux操作系统:字符串处理及awk与sed_第4张图片
2、在ping命令中获取ip地址
[root@numberone ~]# pingwww.baidu.com -c 1
PING www.baidu.com (14.215.177.38) 56(84) bytes of data.
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=1 ttl=128 time=19.1 ms
--- www.baidu.com ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 19.162/19.162/19.162/0.000 ms
[root@numberone ~]# ping www.baidu.com -c 1 | grep ^PING
PING www.baidu.com (14.215.177.39) 56(84) bytes of data.
[root@numberone ~]# ping www.baidu.com -c 1 | grep ^PING | awk -F [\(\)] '{print $2}'
14.215.177.38
Linux操作系统:字符串处理及awk与sed_第5张图片

三、sed

sed可依照脚本的指令来处理、编辑文本文件。

1、sed的基本用法
常用的三个选项:
(1)-e 指定脚本或进行多点编辑
(2)-n 显示处理后的结果
(3) -i 永久将编辑保存到指定文件中

常用的6个动作:
(1) a∶新增,a的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
(2) c∶取代, c的后面可以接字串,这些字串可以取代n1,n2之间的行
(3) d:删除,因为是删除,所以d后面通常不接任何字符串;
(4) i∶插入,i的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
(5) p∶打印,将某个选择的数据印出。通常p会与参数sed -n一起运行
(6) s:取代,可以直接进行取代的工作,通常这个s的动作可以搭配正规表达式进行

2、示例

head /etc/passwd > test.txt   先准备一份简单的文本文件

sed '5a Hello woniu' test.txt  在第5行后面添加Hello woniu 的新行
sed '5i He1lo chengdu' test.txt  在第5行前面添加Hello chengdu的新行
sed '2d' test.txt   删除第2行
sed '2,5d' test.txt   删除第2行到第5行
sed '3,$d' test.txt  删除第3行到最后
sed '2,5c Goooooood' test.txt  将第2行到第5行的内容替换为Goooooood
sed -n '/root/p' test.txt   搜索包含r oot的行
sed '/root/d' test.txt  删除所有包含root的行
sed 's/要被取代的字串/新的字串/g'  搜索并进行替换,支持正则表达式,其中 g 代表全局替换,可以不加,按行找第一个
sed -e '' -e '' -e ''  多点编辑,即一条命令多个规则
sed -i '4a Hello' test.txt   直接修改文件,永久生效

1、[root@numberone ~]# head /etc/passwd > test.txt
[root@numberone ~]# cat test.txt
Linux操作系统:字符串处理及awk与sed_第6张图片
2、[root@numberone ~]# sed '5a Hello Woniu' test.txt
[root@numberone ~]# cat test.txt
发现这里的在第五行后面添加新的一行添加只是暂时的添加。
Linux操作系统:字符串处理及awk与sed_第7张图片
3、想要永久添加得加 -i
[root@numberone ~]# sed -i '5a Hello Woniu' test.txt
[root@numberone ~]# cat test.txt
Linux操作系统:字符串处理及awk与sed_第8张图片
4、同理,永久性的删除:[root@numberone ~]# sed -i '6d' test.txt,仅输出删除不加-i即可。Linux操作系统:字符串处理及awk与sed_第9张图片

你可能感兴趣的:(网络安全入门到精通,linux,运维,服务器)