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地址的脚本写的有问题,
导致使用与否多线程时间差异并不大,两者应该是有很大的差距才对
问题留到后面学习多线程更深入再解决吧。
浙公网安备 33010602011771号