• Linux操作系统:字符串处理及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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    实例:
    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
    在这里插入图片描述

    🌹二、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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    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

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    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即可。在这里插入图片描述

  • 相关阅读:
    spring boot使用swagger生成api接口文档
    Qt下实现支持多线程的单例模式
    【C语言】关键字
    ARM接口编程—Interrupt(exynos 4412平台)
    笔试训练2
    nasal脚本起源与环境搭建(flightgear开源项目)
    Spark使用scala语言连接hive数据库
    第一个SpringBoot项目
    java计算机毕业设计网络精品课程网站(附源码、数据库)
    Python Matplotlib legend函数:为每条折线添加图例
  • 原文地址:https://blog.csdn.net/m0_51456787/article/details/126289260