awk、sed、grep文本处理(十五)

一、使用awk,筛选出大于3ms的内容。

2022:04:25 00:00:12 Probing 192.168.1.100:1081/tcp - Port is open - time=5.456ms
2022:04:25 00:00:13 Probing 192.168.1.100:1081/tcp - Port is open - time=2.339ms
2022:04:25 00:00:15 Probing 192.168.1.100:1081/tcp - Port is open - time=2.443ms
2022:04:25 00:00:17 Probing 192.168.1.100:1081/tcp - Port is open - time=2.255ms
2022:04:25 00:00:18 Probing 192.168.1.100:1081/tcp - Port is open - time=2.236ms

答:

# By me  ,吹牛哥, 雨夜人,ghost, PF
awk -F"ms" '/^2022/ {print $(NF-1)}' 1081.txt | awk -F"=" '$NF>3{print $0 "ms"}' 

gawk '{match($0,"^.*time=(.*)ms$",arr); if(arr[1]>3) {print $0}}' text.txt

awk -F= 'int($NF)>3' 1.txt

awk -F'[= a-z]+' '$(NF-1)>3'  1.txt

# 这里的+号解释为 :     0+  省略了0
awk -F'time='   '+$NF>3'  1.txt

awk -F'[=.]' '$(NF-1)>=3' file 
#$F[1]>3为真,x=1,打印当前行。 -alnE'$F[-1]>3&&say'
perl -F= -ape'$_ x=$F[1]>3' file
只打印磁盘使用率高于80%
df -h | awk '+$5>80'

在这里插入图片描述

二、xargs -n 9,每行9个参数。问题 原来字符串 都是带双引号的,用了xargs -n 后,双引号 都被干掉了,怎么破?

在这里插入图片描述

#创建文本
$ echo -e {1..10}, | sed -r 's#([0-9]+),#"\1",#g'
"1", "2", "3", "4", "5", "6", "7", "8", "9", "10",

$ seq 1 10 | sed -r 's#([0-9]+)#"\1",#g' > 1.txt
#六子 、mrqiao
awk -v n=9 'NR%n==0{print s" "$0;s="";next}{s=length(s)?s" "$0:$0}END{print s}' 1.txt

perl -pe 's/\n// if $.%9!=0&&!eof' 1.txt

cat 1.txt | xargs.exe -d'\n' -n9

三、求每个版本php, php-fpm的内存总和(就是$1相加), 并打印出来

https://blog.csdn.net/weixin_42498487/article/details/115245759 《php内存检查,查看php-fpm内存占用命令》

#文本内容:ps -o 'rss,cmd' -C php-fpm
  RSS CMD
 6304 php-fpm: master process (/www/server/php/80/etc/php-fpm.conf)
18432 php-fpm: pool www
19680 php-fpm: pool www
18028 php-fpm: pool www
18100 php-fpm: pool www
18064 php-fpm: pool www
16528 php-fpm: pool www
18756 php-fpm: pool www
20400 php-fpm: pool www
18948 php-fpm: pool www
14500 php-fpm: pool www
18500 php-fpm: pool www
15176 php-fpm: pool www
16408 php-fpm: pool www
14880 php-fpm: pool www
16808 php-fpm: pool www
16276 php-fpm: pool www
15940 php-fpm: pool www
14452 php-fpm: pool www
16424 php-fpm: pool www
16052 php-fpm: pool www
18540 php-fpm: pool www
13640 php-fpm: pool www
 6008 php-fpm: master process (/usr/local/php74/etc/php-fpm.conf)
 5508 php-fpm: pool www
 5508 php-fpm: pool www
18908 php-fpm: pool www
 5452 php-fpm: master process (/www/server/php/72/etc/php-fpm.conf)
 8936 php-fpm: pool www
 8432 php-fpm: pool www
 9128 php-fpm: pool www
 5604 php-fpm: pool www
 6536 php-fpm: pool www
 6284 php-fpm: pool www
 6284 php-fpm: pool www
 5604 php-fpm: pool www
 5604 php-fpm: pool www
 6352 php-fpm: pool www
 7316 php-fpm: master process (/www/server/php/73/etc/php-fpm.conf)
16376 php-fpm: pool www
251372 php-fpm: pool www
15184 php-fpm: pool www
15616 php-fpm: pool www
176076 php-fpm: pool www
18420 php-fpm: pool www
15740 php-fpm: pool www
19856 php-fpm: pool www
16248 php-fpm: pool www
16516 php-fpm: pool www
 9452 php-fpm: pool www
19408 php-fpm: pool www
14924 php-fpm: pool www

在这里插入图片描述

#金枪语
[root~]# awk 'NR>1 && $5~"server"{if(NR>2)print a,sum;sum=0}/server/{a=$5}{sum=sum+$1}END{print a,sum}' list2
(/www/server/php/80/etc/php-fpm.conf) 416768
(/www/server/php/72/etc/php-fpm.conf) 74216
(/www/server/php/73/etc/php-fpm.conf) 612504
#大致就是分组求和 。 By  PF
#数组写法
awk '$5{a=$5;s[a]+=$1;next}a{s[a]+=$1}END{for(i in s)print i,s[i]}' a
	
#不带数组就是要记得清0
awk '$5{if(a)print a,s;s=0;a=$5;s+=$1;next}a{s+=$1}END{print a,s}'  urfile
awk -F ": | +" '{gsub(/^ /,"")}/master/&&NR>1{if(!s){t=$NF;s=$1} else {print s "\t" t;s=0;t=$NF};next;}{s+=$1}END{print s,t}' file

在这里插入图片描述

四、awk处理:将第一列创建为文本,并将第二列逐行追加进文本

文本内容:

Alismatales	potmaa
Alismatales	trirac
Alismatales	tofthi
Alismatales	pleten
Apiales	araela
Apiales	grilit
Apiales	grirac
Apiales	pencor
Apiales	pittru
Aquifoliales	ilerot
Aquifoliales	goncal
Aquifoliales	gonlob
Aquifoliales	gomtet
Arecales	calgra
Asparagales	allhoo
Asparagales	agapra
Asparagales	hyphem
Asparagales	iridic
Asparagales	cyaorc
Asparagales	alover
Asterales	codlan
Asterales	plagra
Asterales	stylar
Asterales	donfas
#三年路由五年交换   会报错,但思路可参考
#cat test.txt | awk  '{if(!a[$1]++) {system("echo $2 >> $1")} }'
#cat test.txt | awk  '{system("echo $2 >> $1")}}'

#小白
awk '{if($1) {system("echo "$2" >> "$1" ") } else getline;}' test0731.txt  

在这里插入图片描述

五、字符串abc-server-0.0.1-snapshot.jar,要截取成abc-server.jar。还有个名称是abc-0.0.1-snapshot.jar

文本内容:

abc-server-0.0.1-snapshot.jar
abc-0.0.1-snapshot.jar

处理方法:

#make by PF,带头大哥
sed -r "s#(abc.*)-0.*(.jar)#\1\2#g" 1.txt

awk -F'-0' '{print $1".jar"}' < <(cat 1.txt)

#这种需求我见过,自动打包出来的包,想把版本号去掉,版本号不一定是用0开头的
#  -vOFS  就是设置OFS变量
awk -F- -vOFS=- 'NF-=2{print $0".jar"}' 1.txt
知识点参考:
《shell 里的进程替换(Process Substitution)》  https://www.runoob.com/w3cnote/shell-process-substitution.html

在这里插入图片描述
2
在这里插入图片描述

六、awk分别输出指定匹配的行。

#需求:
红色箭头是我需要取得数据, 一个IP一个内存瞬时值

在这里插入图片描述

#by MR.qiao
#匹配到IP之后 往下15行 取那一行全部。    # 这个a是指定的输出行的,可以将 --a==1的值,如--a==10 来看效果。

#Steven解释:
#通过正则找到开头是IPv4地址的行,然后IP这个变量存当前行,也就是这个IP行,另外,定义个变量a=15,awk在当前行是15,
#往后他不是每读一行就--嘛,到了你要的那一行,a变减成1了,减成1了,条件就成立了,就打印了IP变量存的那个IP行和当前行了。
#IP变量的定义和a这个变量都是以正则为条件的;print IP,$0是以--a==1为条件的。这里一共有两个条件
#第一个条件是awk自身的语法;第二个条件是C风格的语法。因为awk是C写的,所以它两种语法都可以。awk是每行读入的,隐式的循环
awk '/^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/{IP=$0;a=15}{if(--a==1){print IP,$0}}'

awk '/^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/{a=NR;printf $0}{if(NR==a+13){print $0}}'
awk每读一行,它都执行一遍里面的代码。代码测试为真它就执行,不为真它就不执行。
也就是说每一行它都匹配一下是不是开头是IP地址,如果不是的,它就不执行那个{IP=$0,a=15}这个代码;不管为不为真,它还要再测试后面的代码,if ...,如果条件也不成立,它就也不执行,在执行if测试的时候,它会触发--a的动作,也就是a=a-1,得到结果后跟1对比,是不是相等,如果相等它才打印后面的语句。

所以每过一行,a都会减1;到下一个IP地址行,因为条件成立,所以IP又赋值为这次的IP地址行,a又为赋值为15。
#seq 10|awk 'i=!i'
它一开始就是15,再--,永远也不成立,所以第一条命令没有输出。第二条,那个IP跟$0的内容相同,所以打印了两次一样的。

在这里插入图片描述

文本内容:

zj-2.25.194.228.80 
25.194.228.80  
i-xc201059jlzng4hfuqlq 
default-no... 	
Master
可调度
ecs.n4.4xlarge
16 vCPU 32 GiB
/
33.69%
63.81%
19.26%
30.85%
49.68%
63.62%
v1.18.8-aliyun.1
Docker 19.3.15
centos_7_7_x64...	2022-03-04 15:04:36	
更多
	
zj-2.25.194.228.81 
25.194.228.81  
i-xc201vob153b4rsyzeqt 
default-no... 	
Master
可调度
ecs.n4.8xlarge
32 vCPU 64 GiB
/
29.34%
45.34%
11.52%
28.04%
37.41%
41.94%
v1.18.8-aliyun.1
Docker 19.3.15
centos_7_7_x64...	2022-03-04 15:07:29	
更多
	
zj-2.25.194.228.94 
25.194.228.94  
i-xc201vob153b59k8zwkf 
default-no... 	
Worker
可调度
ecs.mn4.8xlarge
32 vCPU 128 GiB
/
87.00%
3,274.72%
12.21%
72.92%
101.79%
79.25%
v1.18.8-aliyun.1
Docker 19.3.15
centos_7_7_x64...	2022-03-04 15:40:10	
更多

七、使用shell grep取出关键字,for循环输出想要的内容。

要求:

想把a文件格式用正则表达式改成b文件固定格式
json是源文件,m3u是目标格式 ,https://www.right.com.cn/forum/thread-8312099-2-1.html这个是我的帖子

在这里插入图片描述
需要生成的demo的m3u文件

#EXTINF:-1tvg-id="4"tvg-name="CCTV-1高清",CCTV-1高清
http://iptv.10086.fund:23334/PLTV/88888888/224/3221227479/index.m3u8
#EXTINF:-1tvg-id="4"tvg-name="CCTV-2高清",CCTV-2高清
http://iptv.10086.fund:23334/PLTV/88888888/224/3221227477/index.m3u8
#EXTINF:-1tvg-id="4"tvg-name="CCTV-3高清",CCTV-3高清
http://iptv.10086.fund:23334/PLTV/88888888/224/3221227435/index.m3u8

json文件部分内容:

{"comment":"成功","statu":200,"retValues":[{"ShowStyle":0,"ClassName":"全部","CustomTag":"","ClassId":"66","isPayType":0,"ClassSort":-1,"PlatformType":"SCIPTV","ChannelList":[{"ChannelLogo":"/scdmspic/20201015/20201015034842988.jpg","Number":1,"LiveUrl":"http://sc.rrs.169ol.com:80/PLTV/88888888/224/3221227479/index.m3u8","ActivityId":"","IsInteract":0,"ChannelCode":"10000051000061000020101513164495","isPayType":0,"multicastUrl":"rtp://@239.0.0.10:5140","LockUrl":"http://119.6.199.4:8082/EDS/RedirectPlay/SCTVOTT/lookback/10000100000000050000000000859244/CCTV1b/?PlaySeek={开始时间}-{结束时间}","ChannelId":"b496f2e4-6a1a-4089-9c99-6fe7c3a9d320","Caption":"CCTV-1高清","Name":"CCTV-1高清"},{"ChannelLogo":"/scdmspic/20201015/20201015035032936.jpg","Number":2,"LiveUrl":"http://sc.rrs.169ol.com:80/PLTV/88888888/224/3221227477/index.m3u8","ActivityId":"","IsInteract":0,"ChannelCode":"10000051000061000020101513164496","isPayType":0,"multicastUrl":"rtp://@239.0.0.11:5140","LockUrl":"http://119.6.199.4:8082/EDS/RedirectPlay/SCTVOTT/lookback/10000100000000050000000000859245/CCTV2b/?PlaySeek={开始时间}-{结束时间}","ChannelId":"34236c9b-890a-49a9-88ee-ea7b4c4207ae","Caption":"CCTV-2高清","Name":"CCTV-2高清"},{"ChannelLogo":"/scdmspic/20201015/20201015035246448.jpg","Number":3,"LiveUrl":"http://sc.rrs.169ol.com:80/PLTV/88888888/224/3221227435/index.m3u8","ActivityId":"","IsInteract":0,"ChannelCode":"10000051000061000020101513164497","isPayType":0,"multicastUrl":"rtp://@239.0.0.12:5140","LockUrl":"http://119.6.199.4:8082/EDS/RedirectPlay/SCTVOTT/lookback/10000100000000050000000000859246/CCTV3b/?PlaySeek={开始时间}-{结束时间}","ChannelId":"79a853ae-5029-48cf-ae1d-812aaede39ab","Caption":"CCTV-3高清","Name":"CCTV-3高清"},{"ChannelLogo":"/scdmspic/20201015/20201015030944742.jpg","Number":170,"LiveUrl":"http://sc.rrs.169ol.com:80/PLTV/88888888/224/3221227189/index.m3u8","ActivityId":"","IsInteract":0,"ChannelCode":"10000051000061000020101513164478","isPayType":0,"multicastUrl":"rtp://@239.0.0.75:5140","LockUrl":"http://119.6.199.4:8082/EDS/RedirectPlay/SCTVOTT/lookback/10000100000000050000000000855822/Kakua/?PlaySeek={开始时间}-{结束时间}","ChannelId":"69166fd5-8ec1-4c89-966e-b264d769797d","Caption":"卡酷动画","Name":"卡酷动画"}],"ClassType":0,"pub_key":"99813BE796a827e1522$5278%b0d9cf1"}]}

答:

#法1 by 2285623277 ,使用mapfile ,jq, 数组, for循环
#!/bin/bash

json_file="channel.json"

mapfile -t array1 < <(jq -r '.retValues[].ChannelList[].Number' "$json_file")
mapfile -t array2 < <(jq -r '.retValues[].ChannelList[].LiveUrl' "$json_file")
mapfile -t array3 < <(jq -r '.retValues[].ChannelList[].Caption' "$json_file")
mapfile -t array4 < <(jq -r '.retValues[].ChannelList[].Name' "$json_file")

#for ((i=0; i<${#array1[@]}; i++)); do
#    key=$i
#    value="${array1[$i]} ${array2[$i]} ${array3[$i]} ${array4[$i]}"
#    dict["$key"]=$value
#done
#printf '%s\n' "${dict[1]}" 

for ((i=0; i<${#array1[@]}; i++)); do
    key=$i
    value="#EXTINF:-1tvg-id=\"4\"tvg-name=\"${array3[$i]}\",${array4[$i]}\n${array2[$i]}\n"
    printf "$value"
done

#法2 
#!/bin/bash
captionList=( $(grep -oP '(?<=Caption":").*?(?=",)' channel.json | xargs) )
LiveUrlList=( $( grep -oP '(?<=LiveUrl":").*?(?=",)' channel.json | xargs) )
NumberList=( $( grep -oP '(?<=Number":).*?(?=,)' channel.json | xargs) )
NameList=( $( grep -oP '(?<="Name":").*?(?="}?)' channel.json | xargs) )

length=${#captionList[@]}
for ((i=0; i<$length; i++)); do
	value="#EXTINF:-1tvg-id=\"${NumberList[$i]}\"tvg-name=\"${captionList[$i]}\",${NameList[$i]}\n${LiveUrlList[$i]}\n"
    printf "$value"
done > qwe.m3u

sed -r -i.bak "s#sc.rrs.169ol.com:80#iptv.10086.fund:23334#g" qwe.m3u
cat qwe.m3u

八、使用sed 、perl 将文本中指定的 , 换成 | 符号

#文本其中一行内容:
1,张三,男,"北京,上海,深圳",13012312345

#需求:
入数据库时,平常以 ,号为分隔符。那上面的就不符合。那怎么改成: 
1|张三||"北京,上海,深圳"|13012312345
#写固定了。不够灵活
sed -r 's#(.*),(.*),(.*),(".*"),(.*)#\1|\2|\3|\4|\5#g' 1.txt

#perl(推荐) make by steven   只要“跳过”指定的那种段
perl -i -pe's#"[^"]+"(*SKIP)(*F)|,#|#g' 1.txt

8.1 题外话: 这里的perl跟之前群友问的问题,可引用相同的逻辑。
#文本: (这是一行)
-----BEGIN PUBLIC KEY----- wIjaqqaKCAqqqwYke1+eiey phTxO7AgZiLwwqqwIVdFbBpwwtX E76nYqvoqqqwGtxhxoITpb7Spn /qlJCw8NTrawqqstWTaDBOtX7KFwE2GU6nYGQn29 wsqqqw+qqqvYcmNz6Bb4Iw qqqqZf2wZqqqZyFICI eQIDAQAB -----END PUBLIC KEY-----

要变成这样:

在这里插入图片描述
解法:

#junlong:
sed -r 's/^(.*BEGIN.*-+) (.*) (-+END.*)$/\1\n\2\n\3/' a.log | sed -e '2s/ /\n/g'

在这里插入图片描述

#steven
perl -pe's#-.*?-(*SKIP)(*F)| #\n#g' 1.txt

在这里插入图片描述

九、将指定关键字末尾的\n换行符给替换掉。

abc
11test
11
22test
22
33test
33
abc

想变成:

abc
11test11
22test22
33test33
abc

解法:

#工具替换
使用notepad++ , ctrl+h  ,查找模式选择“扩展” , 查找目标写  test\n   , 替换为写    test
# 行云流水
sed -r ':a;N;$!ba;s#test\n#test#g' 1.txt
#  mrqiao
perl -pe's/\n// if/test$/' 1.txt

在这里插入图片描述

十、使用awk将题目+选项的内容 变成一行式(制作csv)

#要求  使用shell,将下面test.txt文本的内容
47、 Redis借助许多高层次接口可以胜任下列哪些角色。( )
A. 缓存
B. 队列系统
C. 分布式存储
D. 计算
待检查
48、 局域网中的一台PC机,其IP地址为10.10.10.1,掩码为255.255.224.0,则主机在完成下面的( )动作中
A. 地址:10.10.40.1
B. 地址:127.0.0.1
C. 地址:129.0.0.1
D. 地址:10.10.30.1
E. 地址:10.10.20.1
F. 地址:224.0.0.1
待检查
49、 九天平台上的能力研发流程包括()
A. 模型训练
B. 数据准备
C. 模型准备
D. 能力封装


#经过shell处理test.txt变成。怎么实现

47、 Redis借助许多高层次接口可以胜任下列哪些角色。( ) | A. 缓存| B. 队列系统|C. 分布式存储|D. 计算
48、 局域网中的一台PC机,其IP地址为10.10.10.1,掩码为255.255.224.0,则主机在完成下面的( )动作中|A. 地址:10.10.40.1|B. 地址:127.0.0.1|C. 地址:129.0.0.1|D. 地址:10.10.30.1|E. 地址:10.10.20.1|F. 地址:224.0.0.1
49、 九天平台上的能力研发流程包括()|A. 模型训练|B. 数据准备|C. 模型准备|D. 能力封装
#使用awk
awk '/^[0-9]+、/{if(NR!=1) printf "\n"; printf $0" "} /^[A-H]. /{printf "|" $0} END {printf "\n"}' timu.txt

#全过程:
1、将word转换成txt
2、用sed 将每个选项变成一行 (最初的文本是  A. 作为独立的一行,  然后下面是选项内容)
sed '/A\./{N;s/\n//};/B\./{N;s/\n//};/C\./{N;s/\n//};/D\./{N;s/\n//};/E\./{N;s/\n//};/F\./{N;s/\n//};/G\./{N;s/\n//};' L2.txt
3、用awk处理
4、以| 分隔 csv 。导入到Excel。 然后再复制粘贴到模板的 Excel   (半自动化的操作)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值