Linux - awk-for循环多线程的简单使用
目录
例:查看 passwd文件中$3>1000的第一个,第三个,第七个字段
awk命令
awk命令 与 sed'命令一样,均是一行一行地读取,处理
sed作用于一整行的处理,而awk将一行分成数个字段来处理
awk 的数据字段变量:
$0表示整个文本
$1表示文本中第一个数据字段
$2表示文本中第二个数据字段
$n表示文本中第n个数据字段
awk用 -F来指定分隔符
awk默认的分隔符是任意空白字符(空格或者TAB)
#############################################
awk的完整语法
awk ‘BEGIN {commands} pattern {commands}END{commands}' file1
处理数据前执行的命令 处理数据后执行的命令
print 是awk里的命令 用来输出内容
awk的命令的执行过程
==========================
执行BEGIN{commands}语句块中的语句
从文件或stdin中读取第一行
有无模式匹配,若无则执行{}中的语句
若有则检查该整行与pattern是否匹配,若匹配,则执行{}中的语句
若不匹配则不执行{}中的语句,接着读取下一行
重复这个过程,知道所有行被读取完毕
执行END{commands语句块中的语句}
BEGIN 和 END 部分只是执行一次
中间部分每一行都执行一次
============================
例:查看 passwd文件中$3>1000的第一个,第三个,第七个字段
[root@localhost lianxi]# awk -F: 'BEGIN{print ####start#### } $3>1000 {print $1,$3,$7} END{print ####end#### }' /etc/passwd
####start####
chenhang 1001 /bin/bash
zhnagjian 1002 /bin/bash
zhangjian 1003 /bin/bash
wangshenghu 1004 /bin/bash
yalin 1005 /bin/bash
lilanqing 1006 /bin/bash
califeng 1007 /bin/bash
cali123 1008 /bin/bash
shimengmeng 1010 /bin/bash
zhouyiwei 1011 /bin/bash
wangyi 1012 /bin/bash
zhaojunjie 1013 /bin/bash
kimi 1014 /bin/bash
linhucong 1015 /bin/bash
kimi3 1016 /bin/bash
feng1 1017 /bin/bash
feng2 1018 /bin/bash
feng3 1019 /bin/bash
feng4 1020 /bin/bash
feng5 1021 /bin/bash
liudehua 1022 /bin/bash
####end####
#############################################
awk截取一整列
查看student_info.txt,并且截取出第1列和第6列
[root@localhost script]# cat student_info.txt | awk '{print $1,$6}'
name english
cali 75
zhao 85
wang 95
zhou 89
liu 98
#############################################
-F选项指定分隔符
因为awk进行文本截取默认的分割符是空白(空格或者TAB键)
/etc/passwd 文件使用的分隔符是 :
所以使用awk进行截取先要指定分隔符为:
[root@localhost script]# cat /etc/passwd | awk -F : '{print $1$3,$7}'
root0 /bin/bash
bin1 /sbin/nologin
daemon2 /sbin/nologin
adm3 /sbin/nologin
lp4 /sbin/nologin
sync5 /bin/sync
shutdown6 /sbin/shutdown
halt7 /sbin/halt
mail8 /sbin/nologin
operator11 /sbin/nologin
#############################################
NR==2 --》 指定行号来截取字段
例:查看进程的信息,截取第二行第4个字段出来
[root@localhost lianxi]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.6 128016 6672 ? Ss 19:47 0:04 /usr/lib/systemd/systemd
root 2 0.0 0.0 0 0 ? S 19:47 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? S< 19:47 0:00 [kworker/0:0H]
root 5 0.0 0.0 0 0 ? S 19:47 0:00 [kworker/u256:0]
root 6 0.0 0.0 0 0 ? S 19:47 0:00 [ksoftirqd/0]
root 7 0.0 0.0 0 0 ? S 19:47 0:00 [migration/0]
[root@localhost lianxi]# ps aux | awk 'NR==2 {print $4}'
0.6
#############################################
awk字符匹配
例:查找出passwd文件里面,uid>1019,并且名字包含feng的用户信息,输出用户名,uid,shell这三个字段
[root@localhost lianxi]# cat /etc/passwd | awk -F: '$1 ~ /feng/ && $3 > 1018{print $1,$3,$7}'
feng3 1019 /bin/bash
feng4 1020 /bin/bash
feng5 1021 /bin/bash
#############################################
$NF 打印最后一列
$NF表示我们要截取字段的最后一列
[root@localhost script]# cat /etc/passwd | awk -F : '{print $NF}'
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/sync
/sbin/shutdown
/sbin/halt
/sbin/nologin
#############################################
使用awk计算
例:计算内存的使用率
截取第二行的第三个和第二个字段进行除法运算
[root@localhost lianxi]# free -m
total used free shared buff/cache available
Mem: 972 221 607 7 143 605
Swap: 2047 0 2047
[root@localhost lianxi]# free -m | awk 'NR==2{print $3/$2}'
0.228395
#############################################
"%.2f\n" awk计算的精度问题
[root@localhost script]# a=10
[root@localhost script]# b=30
[root@localhost script]# awk 'BEGIN{printf %.2f\n, '$a'/'$b'}'
0.33
#############################################
for循环多进程(简单使用)
shell里面的多进程思想
并行:同时执行 --》速度快
串行:一个一个执行,按照顺序 --》速度慢
例:
for循环同时产生254个子进程去ping不同的ip地址
(命令) & 产生子bash去执行命令
不用子进程时执行时间:
scan_ip(){
for ip in 192.168.44.{1..5}
do
echo ping $ip
ping $ip -c 1 &> /lianxi/scan_ip.txt
if (( $? == 0))
then
echo $ip
fi
done
}
scan_ip
[root@localhost script]# time bash mointoring.sh
ping 192.168.44.1
ping 192.168.44.2
192.168.44.2
ping 192.168.44.3
ping 192.168.44.4
ping 192.168.44.5
real 0m19.077s
user 0m0.002s
sys 0m0.020s
########################
现在使用多线程
局域网扫描
scan_ip(){
for ip in 192.168.0.{1..5}
do
{ echo ping $ip
ping $ip -c 1 &> /lianxi/scan_ip.txt
if (( $? == 0))
then
echo $ip
fi }&
# 使用wait表示父进程等待多有的子进程都执行完毕以后再退出
# 防止父进程比子进程先执行完成后杀死子进程
done
wait
}
scan_ip
[root@localhost script]# time bash mointoring.sh
ping 192.168.0.2
ping 192.168.0.3
ping 192.168.0.4
ping 192.168.0.5
ping 192.168.0.1
192.168.0.3
192.168.0.5
192.168.0.4
192.168.0.1
real 0m10.010s
user 0m0.005s
sys 0m0.009s
最后关于多线程,可能是因为这个扫描ip地址的脚本写的有问题,
导致使用与否多线程时间差异并不大,两者应该是有很大的差距才对
问题留到后面学习多线程更深入再解决吧。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通