awk数组、tr、计数

本文介绍了多种Linux shell脚本的使用示例,包括统计用户登录类型、域名计数排序、硬件地址转换、awk命令的灵活运用、sed和cut处理文本、数组操作、进程内存占用计算、获取本机IP等,展示了shell脚本在系统管理和自动化任务中的强大功能。
摘要由CSDN通过智能技术生成

1、统计用户登录类型

#!/bin/bash
declare -A  shells (定义关联数组shells)
while read ll   (读取/etc/passwd,ll为变量)

do
type=`echo $ll | awk -F: '{print $7}'`  (type为变量,切割ll后的变量)
let shells[$type]++
done < /etc/passwd

for i in ${!shells[@]}
do
 echo "$i ::::: ${shells[$i]}"                                                        
done
~                                                                                       

[root@localhost ~]# bash tj2.sh
/sbin/nologin ::::: 17
/bin/sync ::::: 1
/bin/bash ::::: 3
/sbin/shutdown ::::: 1
/sbin/halt ::::: 1

2、将域名取出并根据域名进行计数排序处理(常用)

 # cat 1.txt   |  awk -F "/+"  '{ip[$2]++}END{for(i in ip) print i,ip[i]}' | sort  -rnk2

 3、替换硬件地址小写为大写,去掉:

# ip a | grep "link/ether" | awk -F" " '{print $2}' | tr '[a-z]' '[A-Z]'|sed 's/://g' 

4、打印某行某列

# cat /etc/passwd |  column -s :  -t  | awk 'NR==2  {print $3}'    #NR表示行,$跟列($0特殊,表示本行)

# cat /etc/passwd |  column -s :  -t  | awk 'NR==2,NR==4  {print $3}'  #行的范围

# cat /etc/passwd |  column -s :  -t | awk 'NR==1'        #只要某行时,不需要跟print就能出来
root             x  0      0      root                        /root               /bin/bash
注意:column  -t 表示把输出以表格显示,-s参数是指定输出中已经存在的字符变为空格符。 

 5、sed和cut

# sed -n 1,5p file1 | cut -d : -f1-6  (1,5p打印范围,-d 指定分隔符,-f字符串)
root:x:0:0:root:/root
bin:x:1:1:bin:/bin
daemon:x:2:2:daemon:/sbin
adm:x:3:4:adm:/var/adm
lp:x:4:7:lp:/var/spool/lpd

# sed -n 1,5p file1 | cut -c1-6(-c从左往右一个单字符就算一个整体) root:x bin:x: daemon adm:x: lp:x:4 打印1行5列 # sed -n 4p file1 |cut -c 5 (文本里是连续纯字符,-d 和 -f 组合就不适用了) 5

 6、awk拼接打印

# docker images | grep 192 | awk  'BEGIN{OFS=":"}''{print $1,$2}' > 1.txt

# cat images.txt | awk '{print $1 ":" $2}'

 OFS=":"表示以:为拼接符号

 或者

# docker images | grep harbor | awk '{print "docker tag" " " $3 " " $1":"$2}'
docker tag 18036ee471bc harbor.cetccloud.com/amd64/redis-photon:v1.8.2
docker tag ad798fd6e618 harbor.cetccloud.com/amd64/harbor-registryctl:v1.8.2
docker tag 081bfb3dc181 harbor.cetccloud.com/amd64/registry-photon:v2.7.1-patch-2819-v1.8.2
docker tag 1592a48daeac harbor.cetccloud.com/amd64/nginx-photon:v1.8.2
docker tag 42ad5ef672dd harbor.cetccloud.com/amd64/harbor-log:v1.8.2
docker tag 623ed0095966 harbor.cetccloud.com/amd64/harbor-jobservice:v1.8.2
docker tag 03d6daab10c7 harbor.cetccloud.com/amd64/harbor-core:v1.8.2
docker tag 41e264a7980b harbor.cetccloud.com/amd64/harbor-portal:v1.8.2
docker tag 927ecd68ee1f harbor.cetccloud.com/amd64/harbor-db:v1.8.2

 7、awk -F分隔符 'BEGIN { 初始化 } { 循环执行部分 } END { 结束处理 }'   file1   file2

NR放在循环执行部分

# awk '{print NR,$0}' aa.txt,表示行数,显示行号。
1 aadak
2 ksdlb
3 d;smlb
4 fl; b

放在 END { 结束处理 }',表示最后一行。

# awk 'END{print NR,$0}' aa.txt  
4 fl; b

8、求和(docker images镜像的大小)

# cat 1.sh  |grep MB | awk '{sum+=$7}END{print sum}'
7256
# cat 1.sh  |grep MB| awk '{print sum+=$7}END{print sum}'
697
1105
1513
1926
2359
2773
3693
4118
4543
5030
5623
6465
6848
7256
7256

9、tr常用操作
# echo 1 2 3 4 5 6 7 8 9 | xargs -n1 | echo $[ $(tr '\n' '+') 0 ]
45  
注:$[]表示计算,0表示末尾要加的数,因为会9后面的回车符会换成+号。
xargs -n1 :表示每次只传递一个参数
echo 1 2 3 4 | xargs -n1 
1 
2 
3 
4 
echo 1 2 3 4 | xargs -n2 
1 2 
3 4 

批量解压*.tar.gz文件。
ls *.tar.gz | xargs -n1 tar -zxvf

# echo 1 2 3 4 5 6 7 8 9 | xargs -n1 | echo $[ $(tr '\n' '+') 1 ]
46

# echo 1 2 3 4 5 6 7 8 9 | xargs -n1 | echo $[ $(tr '\n' '+') 2 ]
47

# echo 1 2 3 4 5 6 7 8 9 |tr ' ' '+'
1+2+3+4+5+6+7+8+9

# echo 1 2 3 4 5 6 7 8 9 |tr ' ' '+'|bc
45

 -s  压缩重复的部分或者是把多个字符当做一个整体

# cat 1.sh  |grep MB| awk '{print $7}'| tr  "MB\n" '+' 
697+++408+++408+++413+++433+++414+++920+++425+++425+++487+++593+++842+++383+++408+++

# cat 1.sh |grep MB| awk '{print $7}'| tr -s "MB\n" '+' 697+408+408+413+433+414+920+425+425+487+593+842+383+408+

 -d  删除

# cat 1.sh  |grep MB| awk '{print $7}'
697MB
408MB
408MB
# cat 1.sh  |grep MB| awk '{print $7}'|tr -d MB
697
408
408

10、生成任意长度的字符串

# head /dev/urandom | tr -dc A-Za-z0-9 | head -c 12
FZmEl60TxdvX

11、打印所有的进程、slab分别占用内存总量(linux系统内存消耗主要有三个地方:进程、slab、pagecacge)

#  echo `ps aux |awk '{mem += $6} END {print mem/1024/1024}'` GB
0.494217 GB

# echo `cat /proc/meminfo|grep Slab|awk '{mem += $2} END {print mem/1024/1024}'` GB
0.111328 GB

12、取出本机ip

#hostname  -i  |awk -F" " '{print $2}'  #注意,{}外面的单引号
192.168.40.132

#hostname -i
fe80::20c:29ff:fece:16d0%ens33 192.168.40.132 172.17.0.1

#hostname -I
192.168.40.132 172.17.0.1 

13、数组结合for循环

# cat clean-rook-dir.sh
hosts=(
  ke-dev1-master3
  ke-dev1-worker1
  ke-dev1-worker3
  ke-dev1-worker4
)

for host in ${hosts[@]} ; do
  ssh $host "rm -rf /var/lib/rook/*"
done

14、查看Apache的并发请求数及其TCP连接状态

netstat -n | awk ‘/^tcp/ { S[$NF]} END {for(a in S) print a, S[a]}’

结果解读

LAST_ACK 5
SYN_RECV 30
ESTABLISHED 1597
FIN_WAIT1 51
FIN_WAIT2 504
TIME_WAIT 1057
其中的SYN_RECV表示正在等待处理的请求数;
ESTABLISHED表示正常数据传输状态;
TIME_WAIT表示处理完毕,等待超时结束的请求数。 关于TCP状态的变迁,可以从下图形象地看出: 状态:描述 CLOSED:无连接是活动的或正在进行 LISTEN:服务器在等待进入呼叫 SYN_RECV:一个连接请求已经到达,等待确认 SYN_SENT:应用已经开始,打开一个连接 ESTABLISHED:正常数据传输状态 FIN_WAIT1:应用说它已经完成 FIN_WAIT2:另一边已同意释放 ITMED_WAIT:等待所有分组死掉 CLOSING:两边同时尝试关闭 TIME_WAIT:另一边已初始化一个释放 LAST_ACK:等待所有分组死掉

15、多个分隔符提取多个字段

log.txt的内容格式大概如下:

30000|ddddd|/jjjjj/22/nn|20000
3|mmm|/ffffff/222222/mmmmmm|111111

每行的第一个数据和第三个数据和第五个数据截出来,用“,”隔开,写法如下

awk -F'[|/]' '{OFS=","}{print $1,$4,$6}' log.txt

https://www.runoob.com/linux/linux-shell-array.html  数组

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少安在线锤人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值