千家信息网

awk详解及举例

发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,AWK语言v 选项:-F :指明输入时用到的字段分隔符-v var=value: 定义变量v 分割符、域和记录awk 执行时,由 分隔符分隔的字段(域)标记$1,$2..$n称 称为域标识。$0 为所
千家信息网最后更新 2025年01月20日awk详解及举例

AWK语言

v 选项:

-F :指明输入时用到的字段分隔符

-v var=value: 定义变量

v 分割符、域和记录

awk 执行时,由 分隔符分隔的字段(域)标记$1,$2..$n称 称

为域标识。$0 为所有域,注意:和shell 中变量$ 符含义不同

文件的每一行称为记录

省略action行 ,则默认执行 print $0 的 的

$0:打印所有

v 示例:

awk '{print "hello,awk"}'

awk -F: '{print}' /etc/passwd

awk -F: '{print "wang"}' /etc/passwd

awk -F: '{print $1}' /etc/passwd

awk -F: '{print $0}' /etc/passwd

awk -F: '{print $1"\t"$3}' /etc/passwd

tail -3 /etc/fstab |awk '{print $2,$4}'

awk 变量

v 变量:内 置 和自定义变量

v FS :输入字段分隔符,默认为空白字符

awk -v FS=':' '{print $1,FS,$3}' /etc/passwd

awk -F: '{print $1,$3,$7}' /etc/passwd

v OFS :输出字段分隔符,默认为空白字符

awk -v FS=':' -v OFS=':' '{print $1,$3,$7}' /etc/passwd

vRS输入记录分隔符,指定输入时的换行符,原换行符仍有效

awk -v RS=' ' '{print }' /etc/passwd

v ORS :输出记录分隔符,输出时用指定符号代替换行符

awk -v RS=' ' -v ORS='###''{print }' /etc/passwd

打印奇数行或者偶数行:

计算的一些简单方法

统计一文件里单词出现的次数:

NF :字段数量

awk -F '{print NF}' /etc/fstab, 引用内置变量不用$

awk -F: '{print $(NF-1)}' /etc/passwd

v NR :行号

FNR :各文件分别计数, 行号

awk '{print FNR}' /etc/fstab /etc/inittab

FILENAME :当前文件名

awk '{print FILENAME}' /etc/fstab

打印出来时将所属文件名也打印出来

ARGC :命令行参数的个数

awk '{print ARGC}' /etc/fstab /etc/inittab

awk 'BEGIN {print ARGC}' /etc/fstab /etc/inittab

v ARGV:数组,保存的是命令行所给定的各参数

自定义变量( 区分 字符大小写)

(1) -v var=value

(2) program

变量放在{}里和外边的区别:

{}内:每次执行时都要赋值一次

{}外:执行之前先赋值,以后循环使用

-f :调用脚本

printf命令

后边有几个变量,前边就应该有几个格式的定义,即几个%定义,百分号定义和变量要一一对应

v 格式化输出:printf "FORMAT " , item1, item2, ...

(1) 必须指定FORMAT

(2) 不会自动换行,需要显式给出换行控制符,\n

(3) FORMAT 中需要分别为后面每个item 指定格式符

v 格式符:与item 一一对应

%c: 显示字符的ASCII码 码

%d, %i: 显示十进制整数

%e, %E: 显示科学计数法数值

%f :显示为浮点数

10.3总共10位,包括30,一个小数点

%g, %G :以科学计数法或浮点形式显示数值

%s :显示字符串

%u :无符号整数

下图为10个字符:

%%: 显示% 自身

v 修饰符:

#[.#] :第一个数字控制显示的宽度;第二个# 表示小数点后精度,%3.1f

-: 左对齐(默认右对齐) %-15s

+:显示数值的正负符号 %+d

BEGIN:在前面加一个表头

操作符

v 算术操作符:

x+y, x-y, x*y, x/y, x^y, x%y

-x: 转换为负数

+x: 转换为数值

v 字符串操作符:没有符号的操作符,字符串连接

v 赋值操作符:

=, +=, -=, *=, /=, %=, ^=

++, --

v 比较操作符:

==, !=, >, >=, <, <=

v 模式匹配符:~

/etc/passwd中匹配的是root的打印出来:

df里以/dev/sd开头的打印出来

左边和右边匹配包含 !~:不包含bash的行

++在前:先加再打印

++在后:先打印再加:(--同理)

逻辑操作符:与 与&& ,或||,非!

cmd1 cmd2两个命令都要执行,都执行完再决定最终的结果为真还是假

cmd1 && cmd2先看第一个为真,假;如果第一个为假,那么后边的不管真假与第一个都是假,所以有可能后续的不执行

awk里的&&的意思与cmd1 cmd2的含义一样:

条件表达式(三目表达式):

selector?if-true-expression:if-false-expression

如果selector?成立,则执行if-true-expression

如果selector?不成立,则执行if-false-expression

因为?和:将条件表达式分成了三段,所以称为三目表达式

relational expression: 关系表达式,结果为"真"才会被处理

真:结果为非0 值,非空字符串

假:结果为空字符串或0

数字里:0为假,非0为真

字符串:只要不为空都为真

line ranges: 行范围

startline,endline /pat1/,/pat2/ 不支持直接给 出数字

格式

awk -F: '/^root\>/,/^nobody\>/{print $1}'

/etc/passwd

awk -F: '(NR>=10&&NR<=20){print NR,$1}'

/etc/passwd

NR:文件的行号

NF:文件每行的以符号分割的列数

v (5) BEGIN/END 模式

BEGIN{}: 仅在开始处理文件中的文本之前执行一次

END{} :仅在文本处理完成之后执行

awk 控制语句if-else

v 语法:if(condition){statement;…}[else statement]

if(condition1){statement1}else if(condition2){statement2}

else{statement3}

v 使用场景:对awk 取得的整行或某个字段做条件判

查看是否有防火墙以及查看端口号

9000端口改为默认80

awk 控制语句

v while 循环

v 语法:while(condition){statement;…}

v 条件"真",进入循环;条件"假", 退出循环

v 使用场景:

对一行内的多个字段逐一类似处理时使用

对数组中的各元素逐一处理时使用

打印以root开头的,从第一列开始一直循环到最后一列,当小于最后一列时,将该字符长度和名字打印出来,然后i++,一直循环到最后一列

do-while 循环

v 语法:do {statement;…}while(condition)

v无论真假,至少执行一次循环体

-s后可以指定分隔符

for 循环

v 语法:for(expr1;expr2;expr3) {statement;…}

v 常见用法:

for(variable assignment;condition;iteration process)

{for-body}

v 特殊用法:能够遍历数组中的元素

语法:for(var in array) {for-body}

next:

提前结束对本行处理而直接进入下一行处理(awk 自身循环)

awk 数组

v 关联数组:array[index-expression]

v index-expression:

(1) 可使用任意字符串;字符串要使用双引号括起来

(2) 如果某数组元素事先不存在,在引用时,awk 会自动创建

此元素,并将其值初始化为"空串"

若要判断数组中是否存在某元素,要使用"index in array"格 格

式进行遍历

第一步:第一行1进来,$01abc[1]没有赋值为空,为0;!Abc[1]1 abc[1]++1;(1,1

第二步:第二行进来,$02abc[2]没有赋值为空,为0;!Abc[2]1abc[2]++1;(2,1

第三步:第三行进来,$01abc[1]1,因为第一步已经对abc[1]赋值!Abc[1]0abc[1]++2 ;所以(1,2

第四步:第四行2进来,$02abc[2]1,因为第二步已经对abc[2]赋值,

Abc[2]0abc[2]++2 ;所以(2,2

第五步:第五行3进来,$03abc[3]没有赋值为空,等于0;!Abc[3]1abc[3]++1;所以(3,1

以下的同上

awk 数组

v 若要遍历数组中的每个元素,要使用for 循环

v for(var in array) {for-body}

v 注意:var 会遍历array

统计单词出现的次数:(通用代码,统计别的文件也通用)

统计男生和女生平均成绩多少?

awk 函数

v 数值处理:

rand() :返回0 1 之间一个随机数

v 字符串处理:

length([s]) :返回指定字符串的长度

sub(r,s,[t]) :对t 字符串进行搜索r 表示的模式匹配的内容,并将第一个匹

配的内容替换为s

echo "2008:08:08 08:08:08" | awk 'sub(/:/,"-",$1)'

gsub(r,s,[t]) :对t 字符串进行搜索r 表示的模式匹配的内容,并全部替换

s 所表示的内容

echo "2008:08:08 08:08:08" | awk 'gsub(/:/,"-",$0)'

split(s,array,[r]) :以r 为分隔符 , 切割字符串s ,并将切割后的结果保存

array 所表示的数组中,第一个索引值为1, 第二个索引值为2,…

netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}

END{for (i in count) {print i,count[i]}}'

awk 函数

v 自定义函数

v 格式:

function name ( parameter, parameter, ... ) {

statements

return expression

}

v 示例:

#cat fun.awk

function max(v1,v2) {

v1>v2?var=v1:var=v2

return var

}

BEGIN{a=3;b=2;print max(a,b)}

awk 脚本

v将 将awk 程序写成脚本,直接调用或执行

v 示例:

#cat f1.awk

{if($3>=1000)print $1,$3}

#awk -F: -f f1.awk /etc/passwd

#cat f2.awk

#!/bin/awk -f

#this is a awk script

{if($3>=1000)print $1,$3}

#chmod +x f2.awk

#f2.awk -F: /etc/passwd

awk 脚本传递参数

v 格式:

awkfile var=value var2=value2... Inputfile

v 注意 :在BEGIN 过程 中不可用。直到 首行输入完成以后 ,变

量才可用 。可以通过-v 参数,让awk 在执行BEGIN 之前得到

变量的值。命令行中每一个指定的变量都需要一个-v 参数

v 示例:

#cat test.awk

#!/bin/awk -f

{if($3 >=min && $3<=max)print $1,$3}

#chmod +x test.awk

#test.awk -F: min=100 max=200 /etc/passwd

字符 变量 字符串 循环 数组 文件 处理 分隔符 格式 字段 操作符 元素 参数 命令 数值 条件 符号 结果 表达式 语法 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全包括那三个 厦门短期兼职网络安全维护 网络安全工作协调会商机制 软件开发保险公司与银行 致敬网络安全宣传短片 服务器管理口的作用是什么 四川乘捷互联网科技有限公司 数据库历史这么查询 32核图形处理器和服务器哪个快 怎样用手机设置oa服务器地址 6g网络技术储备上市公司 辽宁运营软件开发方案 数据库监听器怎么开 数据库管理技术 第一范式 数据库视图总结 ps5升级无法连接服务器 网络安全身份认证实验报告 本地计算机访问服务器账号 辽宁品质软件开发过程服务标准 贵州中西部服务器虚拟主机 论信息系统与数据库技术论文 手机账号服务器异常怎么解决 云服务器初始密码 网络安全报告 勒索 信息技术数据库研究 安溪租房网络安全 用友数据库fd代表什么 沭阳汇龙互联网科技有限公司 南阳微信公众号网络安全 迅云防护服务器
0