一、使用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 (半自动化的操作)