假设有变量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#*//}
输出删除//左边的部分
3、[root@numberone ~]# echo ${url##*/}
从左边开始到最右边删除最后一个/号及左边的所有字符
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
对文本进行逐行处理的编程语言,它来源于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
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
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
2、[root@numberone ~]# sed '5a Hello Woniu' test.txt
[root@numberone ~]# cat test.txt
发现这里的在第五行后面添加新的一行添加只是暂时的添加。
3、想要永久添加得加 -i
[root@numberone ~]# sed -i '5a Hello Woniu' test.txt
[root@numberone ~]# cat test.txt
4、同理,永久性的删除:[root@numberone ~]# sed -i '6d' test.txt
,仅输出删除不加-i即可。