Linux - awk-for循环多线程的简单使用

目录

awk命令

awk的完整语法

awk的命令的执行过程

例:查看 passwd文件中$3>1000的第一个,第三个,第七个字段

awk截取一整列

-F选项指定分隔符

NR==2 --》 指定行号来截取字段

awk字符匹配

$NF 打印最后一列

使用awk计算

"%.2f\n" awk计算的精度问题

for循环多进程(简单使用)



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地址的脚本写的有问题,

导致使用与否多线程时间差异并不大,两者应该是有很大的差距才对

问题留到后面学习多线程更深入再解决吧。

posted @   JackLovey3  阅读(50)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示