目录:
# awk '{print $0}' /etc/passwd # echo hhh|awk '{print "hello,world"}' # awk '{ print "hiya" }' /etc/passwd
你将会见到/etc/passwd文件的内容出现在眼前,现在,解释 awk做了些什么;
调用awk时,我们指定/etc/passwd作为输入文件,执行awk时,它依次对/etc/passwd中的每一行执行print命令,所有输出都发送到stdout,所得到的结果与执行cat /etc/passwd完全相同;
现在,解释{ print }代码块,在awk 中,花括号用于将几块代码组合到一起,这一点类似于C 语言,在代码块中只有一条 print命令;
在awk 中,如果只出现print命令,那么将打印当前行的全部内容,再次说明,awk 对输入文件中的每一行都执行这个脚本;
$0 当前记录 $1~$n 当前记录的第n个字段 FS 输入字段分隔符,默认是空格 RS 输入记录分割符,默认为换行符 NF 当前记录中的字段个数,就是有多少列 ,重点 NR 已经读出的记录数,就是行号,从1开始 ,重点 OFS 输出字段分隔符,默认也是空格 ORS 输出的记录分隔符,默认为换行符
# awk -F: 'BEGIN{OFS="#"}$1=="root"{print $1,$2,$3}' /etc/passwd #输出$1=="root"的行,且把空格改为#连接 root#x#0
示例:
# awk -F: '/^root/{print}' /etc/passwd #以root开头的 # awk -F: '$1!~/root/{print}' /etc/passwd #$1包含root字符串的
通常对于每个输入行,awk都会执行每个脚本代码块一次; 然而,在许多编程情况中,可能需要在awk开始处理输入文件中的文本之前执行初始化代码;
对于这种情况,awk允许您定义一个BEGIN 块. 因为awk在开始处理输入文件之前会执行BEGIN块;
因此它是初始化 FS(字段分隔符)变量、打印页眉或初始化其它在程序中以后会引用的全局变量的极佳位置。
awk还提供了另一个特殊块,叫作 END块,awk在处理了输入文件中的所有行之后执行这个块;
通常,END块用于执行最终计算或打印应该出现在输出流结尾的摘要信息。
语法格式:
# awk -F: 'BEGIN{语句块}{print}END{语句块}' /etc/passwd
5、awk数组
数组可以使用一个数组名称存储多个值,与普通变量不一样;
定义格式:数组名[下标]=值
# awk 'BEGIN{a[0]=100;print a[0]}' # awk 'BEGIN{a[0]=100;a[1]=200;a[2]=300;for(i in a) print a[i] }' #结合for循环,循环下标
# awk -F: '{if($3<=1000){i++} } END{print i}' /etc/passwd #统计用户UID<=1000的用户,逐行处理 # awk -F: '{if($3<=1000){i++}else{j++} } END{print i,j}' /etc/passwd #双分支
for语句:
# awk '{a[$1]++ END{for(i in a ){print i,a[i]}}}' iptxt #统计iptxt清单中每个IP地址出现的次数,用a[ip地址],也就是IP地址做为下标
# awk '{print res_ip," ",$0}' res_ip=$i temp.txt >>result.txt #awk引用外部变量
# ab -c 1 -n 50000 http://127.0.0.1/index.html #每秒50000次的http请求压力测试 # sort -n txt5 #升序排列,-n表示要比较整个数字,默认只按第1位排 # sort -r -n txt5 #降序排列,-n表示要比较整个数字,默认只按第1位排 # awk -F '.' '{print $3"\t"$4"\t"$0}' prod_vm_ip.txt |sort -n -k 1 -k 2|awk '{print $3}'>prod_ip.txt #awk 排序不同网段的IP地址 # uptime | awk '{print "cpu平均负载: "$10,$11,$12}' #CPU负载 # free -m | awk '/^Mem/{print "主机剩余内存"$4"M"}' #主机剩余内存 # df -h | awk '/vda1/{print "磁盘剩余空间: "$4}' #磁盘剩余空间 # ifconfig eth0 | awk '/RX p/{print "网卡eth0接收的数据量是"$5"字节"}' # awk '{x++}END{print "主机拥有的账户总数是:"x" 个"}' /etc/passwd
标签:BEGIN,END,etc,passwd,文本处理,print,awk,整理 From: https://www.cnblogs.com/reachos/p/16809154.html