|
|
完美的杯子 · javascript - Getting ...· 2 年前 · |
|
|
爱跑步的松鼠 · AzureAD Token ...· 2 年前 · |
|
|
眉毛粗的水龙头 · c语言创建文件夹的命令-掘金· 2 年前 · |
|
|
有胆有识的海龟 · How to get height of ...· 2 年前 · |
|
|
爱跑步的电池 · c# json array get ...· 2 年前 · |
AWK的内置变量(NF、NR、FNR、FS、OFS、RS、ORS)
AWK对文件的"某一列进行去重"的做法 (命令: awk '{a[$n]=$0}END{for(i in a)print a[i]}' filename)
shell将多行转为一行(或将多行中的某一列转化为行)的做法
awk 'BEGIN{//begin code } pattern1{//pattern1 code} pattern2{//pattern2 code} END{//end code }'
BEGIN部分的代码,最先执行
然后循环从管道中读取的每行文本,如果匹配pattern1 ,则执行pattern1 code的代码,匹配pattern2,则执行pattern2 code代码
最后,执行END部分的代码end code
如下所示,分别求奇数行与偶数行的和:
$ seq 1 5
1
2
3
4
5
$ seq 1 5|awk 'BEGIN{print "odd","even"} NR%2==1{odd+=$0} NR%2==0{even+=$0} END{print odd,even}'
odd even
9 6
原文链接:https://blog.csdn.net/weixin_31201737/article/details/113045998
有这样一个文本,需要截取前5列
[root@SH]# cat test.txt
2 3651415576 940761 0 0 0000000000000000
3 3532686312 939551 0 0 0000000000000000
4 3873453656 984285 0 0 0000000000000000
5 3884604640 970761 0 0 0000000000000000
6 2116906224 493295 0 0 0000000000000000
7 1760674752 480700 0 0 0000000000000000
8 0 0 29979808 6002 0000000000000000
10 0 0 3299944 1433 0000000000000000
11 0 0 2199434640 312565 0000000000000000
awk '{print $1,$2,$3,$4,$5} #(别忘了“,”,否则黏在一起,$1 $2 $3与$1$2$3没什么不同.)
awk '{NF-=2}1' #输出倒数第二列之前的所有列
这里的1换成别的数字也可以,NF-=2表示倒数第二列
https://my.oschina.net/u/3746745/blog/1923899
linux下统计某个进程的CPU占用和内存使用
#!/bin/bash
# while loop
CpuMemStat=""
datemk=""
while true
do
CpuMemStat=` ps aux |grep -i server |grep redis |grep -v py`
datemk=`date "+%Y-%m-%d %H:%M:%S"`
echo $datemk $CpuMemStat >> result.txt
#echo $datemk $CpuMemStat
sleep 20s
done
上面的遇到CpuMemStat结果是多行的就歇菜了,改成
#!/bin/bash
# while loop
CpuMemStat=""
datemk=""
CpuMemStat=`ps aux |sed -n '1p'|awk '{print $1,$2,$3,$4,$5}'`
datemk=`date "+%Y-%m-%d %H:%M:%S"`
echo $datemk $CpuMemStat >> result.txt
while true
do
#CpuMemStat=` ps aux |grep -i redis-server|awk '{print $1,$2,$3,$4,$5}'`
datemk=`date "+%Y-%m-%d %H:%M:%S"`
ps aux |grep -i redis-server|awk '{print $1,$2,$3,$4,$5}'|while read line
do
echo $line
echo $datemk $line >> result.txt
#echo $datemk $CpuMemStat
done
sleep 1s
done
输出第二列到最后
echo 'a b 1 3'|awk '{ $1=""; print $0 }'
输出第三列到最后
echo 'a b 1 3'|awk '{ $1=$2=""; print $0 }'
取第N列到最后
awk '{ for(i=1; i<=N; i++){ $i="" }; print $0 }' urfile
*思路就是把不要的行置为空”“。
取第3列到第6列
awk '{ for(i=1; i<=2; i++){ $i="" }; for(i=7; i<=NF;i++){ $i="" }; print $0 }' test.txt
取按 " " 分割的第 2 列
cut -d"" -f2 test.txt
取按 " " 分割的第 2 和第 5 到第 10 列
cut -d" " -f 2 ,5-10 test.txt #这只适合列之间的间隔是一个空格,多的需要用tr压缩
使用cut
# -d表示分割按什么分割txt的行, -f2 后面的数字表示列数,从1开始
# tets.txt 文件名
cut -d"" -f2 test.txt
#cut命令将行按指定的 分隔符 分割成多列。它的弱点在于不好处理多个分隔符重复的情况,因此经常结合tr的压缩功能。
cat file.txt | tr -s ' ' | cut -d ' ' -f1,3
awk基本语法如下:
awk 'BEGIN{//begin code } pattern1{//pattern1 code} pattern2{//pattern2 code} END{//end code }'
BEGIN部分的代码,最先执行
然后循环从管道中读取的每行文本,如果匹配pattern1 ,则执行pattern1 code的代码,匹配pattern2,则执行pattern2 code代码
最后,执行END部分的代码end code
如下所示,分别求奇数行与偶数行的和:
$ seq 1 5
1
2
3
4
5
$ seq 1 5|awk 'BEGIN{print "odd","even"} NR%2==1{odd+=$0} NR%2==0{even+=$0} END{print odd,even}'
odd even
9 6
原文链接:https://blog.csdn.net/weixin_31201737/article/details/113045998
OSD 删除黑名单的命令是:ceph osd blacklist rm 192.168.31.66:6800/2776253500
OSD 列出黑名单的命令是: ceph osd blacklist ls
192.168.31.109:6800/3185421984
192.168.31.66:6800/2776253500
192.168.31.109:6800/1802746272
192.168.31.66:6800/3330484028
192.168.31.109:6800/3170500668
192.168.31.66:6849/4132697147
192.168.31.65:6849/579778875
我们需要 遍历黑名单执行 ceph osd blacklist rm xxxxx
ceph osd blacklist ls |awk '{system("ceph osd blacklist rm " $1)}'
(ceph osd blacklist rm 不是awk的内置命令,所有用system)
info.txt
-5 10.47839 root ssdpool
-25 10.47839 rack rack.ssdpool
-28 3.49280 host rdma61.ssdpool
18 ssd 0.87320 osd.18 up 1.00000 1.00000
21 ssd 0.87320 osd.21 up 1.00000 1.00000
24 ssd 0.87320 osd.24 up 1.00000 1.00000
28 ssd 0.87320 osd.28 up 1.00000 1.00000
-31 3.49280 host rdma63.ssdpool
20 ssd 0.87320 osd.20 up 1.00000 1.00000
22 ssd 0.87320 osd.22 up 1.00000 1.00000
25 ssd 0.87320 osd.25 up 1.00000 1.00000
27 ssd 0.87320 osd.27 up 1.00000 1.00000
-34 3.49280 host rdma64.ssdpool
19 ssd 0.87320 osd.19 up 1.00000 1.00000
23 ssd 0.87320 osd.23 up 1.00000 1.00000
26 ssd 0.87320 osd.26 up 1.00000 1.00000
29 ssd 0.87320 osd.29 down 0 1.00000
写一个shell脚本 run.sh,我给它参数61(或者63或64), 它就读取host rdma61.ssdpool下面的行文字的第一个字段,并逐一输出log+字段,直至遇到下一个host rdma 停止。
如: run.sh 61
log18.txt
log21.txt
log24.txt
log28.txt
如: run.sh 63
log20.txt
log22.txt
log25.txt
log27.txt
awk -v flag=0 '
/host rdma'$1'/ {flag=1; next}
flag == 1 && /host rdma/ {flage=0; exit}
flag == 1 {print "log"$1".txt"}
' info.txt
-v flag=0 # 设置变量flag=0
/host rdma'$1'/ {flag=1; next} #匹配到host rdma'$1'执行flag=1; next,netx 表示不匹配本文本行后面的内容,直接跳到下一行文本
flag == 1 && /host rdma/ {flage=0; exit} #flag == 1 且匹配到host rdma,则执行{flage=0; exit} ,exit 退出结束
flag == 1 {print "log"$1".txt"} #flag == 1 且匹配到host rdma,则执行print "log"$1".txt"
原文链接:https://blog.csdn.net/bandaoyu/article/details/103190949
有两种方法:
1.awk内置函数system
2.通过awk print出要执行的命令 然后交给/bin/bash 执行
执行方法 awk ‘BEGIN{system(“shell命令)}’ 就行
[root@CHSHA-CT-WWW-249 ~]# awk ‘BEGIN{system(“hostname”)}’
CHSHA-CT-WWW-249.360buy.com
[root@CHSHA-CT-WWW-249 ~]# awk ‘BEGIN{system(“df -h”)}’
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda1 19G 2.9G 16G 16% /
/dev/sda3 236G 215M 223G 1% /export
tmpfs 16G 0 16G 0% /dev/shm
[root@CHSHA-CT-WWW-249 ~]# awk ‘BEGIN {system(“echo \”input one number:\”"); getline d;print “you input number is”,d}’
input one number:
12
you input number is 12 #这个采用了awk getline取前面的输入
[root@CHSHA-CT-WWW-249 ~]# awk ‘BEGIN{print “echo”,”cange”}’|sh
cange
[root@CHSHA-CT-WWW-249 ~]# awk ‘BEGIN{print “echo”,”cange”|”bash”}’
cange
[root@CHSHA-CT-WWW-249 ~]# awk ‘BEGIN{print “df -h”|”bash”}’
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda1 19G 2.9G 16G 16% /
/dev/sda3 236G 215M 223G 1% /export
tmpfs 16G 0 16G 0% /dev/shm
[root@CHSHA-CT-WWW-249 ~]# awk ‘BEGIN{print “hostname”|”bash”}’
CHSHA-CT-WWW-249.360buy.com
可能上面的例子很简单, 确实 但是原理就是这样 可能工作上你们的需求不同 整个过程不可能这么简单 但是按照这种方式进行处理就行 , 例如对一下文件的重命名 那就可以
pirnt mv 一个原始文件 跟你要改成的文件 交给bash就行了。
[root@CHSHA-CT-WWW-249 test]# ls|awk ‘{print “mv “$0″ A_”$0}’
mv 1.jpp A_1.jpp
mv 2.jpp A_2.jpp
mv 3.jpp A_3.jpp
[root@CHSHA-CT-WWW-249 test]# ls|awk ‘{print “mv “$0″ A_”$0}’|bash
[root@CHSHA-CT-WWW-249 test]# ls
A_1.jpp A_2.jpp A_3.jpp
awk '{system(“ls ” $1)'| some.txt
即 sytem()括号内,加双引号的“”看待成shell命令,不加双引号的看待成awk环境变量,system("echo "$1"\"-->\"") shell命令内有双引号的,需要\转译。
ibv_devices
device node GUID
------ ----------------
rocep24s0f2 b69691fffea59b5e
rocep24s0f1 b69691fffea59b5d
rocep24s0f3 b69691fffea59b5f
rocep24s0f0 b69691fffea59b5c
ibv_devices|awk 'BEGIN{ echo "--"} /rocep/{system("echo "$1"\"-->\"`ls /sys/class/infiniband/"$1"/device/net`")} END{echo "--"}'
rocep24s0f2-->ens2f2
rocep24s0f1-->ens2f1
rocep24s0f3-->ens2f3
rocep24s0f0-->ens2f0
NF代表一行的字段个数,NR代表文本文件的行数
1、打印文件的第一列(域) : awk '{print $1}' filename
2、打印文件的前两列(域) : awk '{print $1,$2}' filename
3、打印完第一列,然后打印第二列 : awk '{print $1 $2}' filename
4、打印文本文件的总行数 : awk 'END{print NR}' filename
5、打印文本第一行 :awk 'NR==1{print}' filename
6、打印文本第二行第一列 :sed -n "2, 1p" filename | awk 'print $1'
#(获取test文件的第4行)
#cat test| awk 'NR==4'或cat test|sed -n '4p'直接获取某一行的数据
shell里面的赋值方法有两种,格式为
1) arg=`(命令)`
2) arg=$(命令)
因此,如果想要把某一文件的总行数赋值给变量nlines,可以表达为:
1) nlines=`(awk 'END{print NR}' filename)`
或者
2) nlines=$(awk 'END{print NR}' filename)
一、在awk 体中定义变量的值:
1.1 使用-v 参数指定变量
[root@node1 sh]# echo "hello"|awk -v aa=test2 -v bb=test3 '{print aa,bb}'
test2 test3
2.2 直接赋值:
[root@node1 sh]# echo "hello"| awk '{print aa,bb} aa=test4,bb=test5 a.txt
test4,bb=test5
二、在awk体外定义了变量如何在awk中引用?
使用左"' 右'"和$符号引用变量aa:
[root@node1 ~]# aa=test
[root@node1 sh]# echo "hello"|awk '{print "'$aa'"}'
test
或者:使用左右都是"'" 和$ 符号引用变量aa:
[root@node1 sh]# echo "hello"|awk '{print "'"$aa"'"}'
test
[root@node1 sh]#
不管是"'$aa 还是 "'"$aa ,双引号、单引号的组合都是为了按从左到右的顺序成对匹配
awk命令用单引号引起来,就是防止shell对其中内容进行解释
https://blog.csdn.net/weixin_42808782/article/details/116257982
wang 4
cui 3
zhao 4
liu 3
liu 3
chang 5
li 2
awk 'length($1)=="4"{print $1}'
执行系统命令
awk '{if($2>3){system ("touch "$1)}}'
gsub(/r/,"s",域) 在指定域(默认$0)中用s替代r (sed 's///g')
awk '{gsub(/liu/,"hong",$1);print $0}' a.txt
列求和
df -h | awk '{a+=$2}END{print a}'
列求平均值
df -h | awk '{a+=$2}END{print a/NR}'
df -h | awk '{a+=$2;b++}END{print a,a/b}'
列求最大值
df -h | awk 'BEGIN{a=0}{if($2>a) a=$2 }END{print a}'
将第一列过滤重复列出每一项,每一项的出现次数,每一项的大小总和
awk '{a[$1]++;b[$1]+=$2}END{for(i in a){print i,a[i],b[i]}}'
awk '$9 >1000 {print $0 }
用户对问题“使用awk选择列中特定值大于x的行”的回答 - 问答 - 腾讯云开发者社区-腾讯云
三剑客之 awk - 知乎
ifconfig eth0|awk -F "[ :]+" 'NR==2{print $4 "/" $NF}'中"[ :]+" 是什么意思?
"[ :]+" 这个是正则表达式(注意[]中的内容是 空格和:),+表示一个或多个,这里就表示一个或多个空格或冒号
1。内建变量FS保存输入域分隔符的值,默认是 空格或tab 。我们可以通过-F命令行选项修改FS的值。如$ awk -F: '{print $1,$5}' test将打印以冒号为分隔符的第一,第五列的内容。
2。-F指定分隔符,指定同时使用多个域分隔符时,应该把分隔符放到方括号中,如$awk -F'[ :\t]' '{print $1,$3}' test,表示以 空格、冒号和tab 作为分隔符。
下面我们来举个例子:
[root@master ~]# echo "inet addr:192.168.55.229 Bcast:192.168.55.255 Mask:255.255.255.0"|awk -F"[ :]" '{print $3}'
192.168.55.229
([]中分别有 空格、: 两种分隔符)
ibv_devinfo|grep -A 17 rocep216s0f2 |grep active_mtu|awk '{print $3}'|awk -F "[()]" '{print $2}'
AWK 技巧(取倒列,过滤行,匹配,不匹配,内置变量等)https://www.cnblogs.com/kevingrace/p/8481965.html
原文: AWK 技巧(取倒列,过滤行,匹配,不匹配,内置变量等)https://www.cnblogs.com/kevingrace/p/8481965.html
分割字符串
#以通配符 "-数字" 作为分割符,并打印第一个分割出来的字符。
$ rpm=mlnx-iproute2-5.19.0-1.58112.x86_64.rpm
$ echo $rpm|awk -F '-[0-9]' '{print $1}'
$ mlnx-iproute2
分割并放入数组方法见:
【shell】shell字符串分割|文件分割|剪切|截取_https://blog.csdn.net/bandaoyu/article/details/120659630
rpm=mlnx-iproute2-5.19.0-1.58112.x86_64.rpm
[
root@localhost
rpms]# echo $rpm|awk -F '-[0-9]' '{print $1}' #以"-数字" 作为分割符
mlnx-iproute2
比如取/etc/passwd文件中的第2列、倒数第1、倒数第2、倒数第4列(以冒号为分隔符)。($NF表示倒数第一列,$(NF-1)表示倒数第二列)
[root@ipsan-node06 ~]
# awk -F":" '{print $2,$(NF),$(NF-1),$(NF-3)}' /etc/passwd
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
|
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 |
|
|
1 2 3 4 5 6 |
|
定时删除resin日志的脚本,每小时删除一次
|
1 2 3 4 5 6 |
|
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
|
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 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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 |
|
|
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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
|
|
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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
|
|
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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
|
|
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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
|
shell取匹配行的前后n行
【shell】用 grep 查找包含字符串的文件|grep 过滤|取匹配行的前后n行_bandaoyu的note-CSDN博客_grep查询包含关键字的文件
刚刚有个网友问到在awk中如何调用shell自定义函数,之前没有用过,摸索了下,创建函数后只需要设置成全局函数就可以直接使用awk的两种方式调用了,代码如下:
点击(此处)折叠或打开
function add1()
{
result=`expr $1 + 1`
echo $result
}
export -f add1
awk 'BEGIN{p=3;"add1 "p|getline result;print result }'
和C语言的printf一样用
BEGIN { printf("%s:%-5.2f \n",“name”, 33.698); };
cat data| awk ‘{sum+=$1} END {print "Sum = ", sum}’ 2、求平均 cat data| awk ‘{sum+=$1} END {print "Average = ", sum/NR}’ 3、求 最大值 cat data| awk ‘BEGIN {max = 0} {if ($1>max) max=$1 fi} END {print “Max=”, max}’ 4、求最小值( 本文介绍了Linux系统中常用的文本处理 命令 及其应用场景。首先,sort 命令 用于对文件或管道内容进 行 排序,支持按数字、 列 、 分隔符 等多种方式进 行 排序,并可结合head 命令 提取前几 行 。其次,uniq 命令 用于去重,常与sort搭配使用,支持显示 重复 次数。此外, awk 命令 用于提取指定 列 ,支持倒数 列 的操作。最后,文章展示了如何利用这些 命令 进 行 日志分析,例如统计IP出现次数或分析密码破解尝试的IP地址。这些 命令 在文件处理、数据分析和日志监控中具有广泛的应用。 文章目录写在前面 awk 求平均值 awk 求 最大值 awk 求最小值 awk 求极值、均值的实际应用 awk 命令 求极值和均值需要熟悉该 命令 的基本用法,如果你不熟悉该 命令 ,请先阅读 shell 脚本之 awk 命令 —— 分隔符 介绍一文。本篇博文带你熟悉 求平均值 、 最大值 、最小值的方法,并以实际的应用带你进一步掌握 awk 的高级用法。 以下为 求平均值 、 最大值 、最小值用到的文件data,使用cat data查看内容为 awk 求平均值 awk '{su # ps aux | grep "java -jar"|grep -v grep| awk '{print $6}'| awk '{sum+=$1} END {print "Sum = ", sum/1024/1024}' Sum = 10.4531 例题:给出8 行 值,要求求出8 行 平均值的平均值,和 列 出8 行 中 最大值 的 最大值 。如此就求出了8 行 数字的平均值和 最大值 ,是不是很简单?1平均值:57.7025, 最大值 :81.5。2平均值:57.1077, 最大值 :79.8。3平均值:57.6491, 最大值 :81.6。4平均值:58.2071, 最大值 :81.9。5平均值:57.1034, 最大值 :83.6。6平均值:57.5858, 最大值 :83.3。7平均值:57.8051, 最大值 :86.7。8平均值:57.5063, 最大值 :83.0。$NF 打印最后一 列 。 1、打印文件的第一 列 (域) : awk '{print $1}' filename 2、打印文件的前两 列 (域) : awk '{print $1,$2}' filename 3、打印完第一 列 ,然后打印第二 列 : awk '{print $1 $2}' filename 4、打印文本文件的总 行 数 :|
|
完美的杯子 · javascript - Getting CAN_NOT_GET_GATEWAY_SERVER exception on joining a call - Stack Overflow 2 年前 |
|
|
眉毛粗的水龙头 · c语言创建文件夹的命令-掘金 2 年前 |