学习简介:
awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。
内容:
模式,模式可以是以下任意一种
- 正则表达式:使用通配符的扩展集
- 关系表达式:使用运算符进行操作,可以是字符串或数字的比较测试
- 模式匹配表达式:用运算符~匹配和~!不匹配
- BEGIN语句块,pattern语句块,END语句块
WAK用法:
基本用法:
awk‘条件1{动作1} 条件2{动作2}…’ 文件名
条件(Pattern):
一般使用关系表达式作为条件。这些关系表达式非常多,例如:
x > 10 判断变量x是否大于10
x == y 判断变量x是否等于变量y
A ~ B 判断字符串A中是否包含能匹配B表达式的子字符串
A !~ B 判断字符串A中是否不包含能匹配B表达式的子字符串
#动作(Action) :
格式化输出
流程控制语句
#常用参数:
-F 指定输入时用到的字段分隔符
-v 自定义变量
-f 从脚本中读取awk命令
-m 对val值设置内在限制
printf 格式化输出
printf ‘输出类型输出格式’ 输出内容
输出类型:
%c: ASCII字符.显示相对应参数的第一个字符
%-ns: 输出字符串,减号“-”表示左对齐(默认右对齐),n是数字指代输出几个字符,几个参数就写几个%-ns
%-ni: 输出整数,n是数字指代输出几个数字
%f: 输出小数点右边的位数
%m.nf: 输出浮点数,m和n是数字,指代输出的整数位数和小数位数。如%8.2f代表共输出8位数,其中2位是小数,6位是整数。
输出格式:
\a: 输出警告声音
\b: 输出退格键,也就是Backspace键
\f: 清除屏幕
\n: 换行
\r: 回车,也就是Enter键
\t: 水平输出退格键,也就是Tab 键
\v: 垂直输出退格键,也就是Tab 键
AWK条件
条件的类型 条件 说明
awk保留字 BEGIN 在awk程序一开始时,尚未读取任何数据之前执行。BEGIN后的动作只在程序开始时执行一次
awk保留字 END 在awk程序处理完所有数据,即将结束时执行。END后的动作只在程序结束时执行一次
关系运算符 > 大于
关系运算符 < 小于
关系运算符 >= 大于等于
关系运算符 <= 小于等于
关系运算符 == 等于。用于判断两个值是否相等,如果是给变量赋值,请使用“”号
关系运算符 != 不等于
关系运算符 A~B 判断字符串A中是否包含能匹配B表达式的子字符串
关系运算符 A!~B 判断字符串A中是否不包含能匹配B表达式的子字符串
正则表达式 /正则/ 如果在"//"中可以写入字符,也可以支持正则表达式
AWK内置变量
awk内置变量 作用
$0 代表目前awk所读入的整行数据。我们已知awk是一行一行读入数据的,$0就代表当前读入行的整行数据。
$n 代表目前读入行的第n个字段。比如,$1表示第1个字段(列),$2表示第2个字段(列),如此类推
NF 当前行拥有的字段(列)总数。
NR 当前awk所处理的行,是总数据的第几行。
FS 用户定义分隔符。awk的默认分隔符是任何空格,如果想要使用其他分隔符(如“:”),就需要FS变量定义。
ARGC 命令行参数个数。
ARGV 命令行参数数组。
FNR 当前文件中的当前记录数(对输入文件起始为1)。
OFMT 数值的输出格式(默认为%.6g)。
OFS 输出字段的分隔符(默认为空格)。
ORS 输出记录分隔符(默认为换行符)。
RS 输入记录分隔符(默认为换行符)。
示例:
打印文本文件的总行数 :
awk 'END{print NR}' filename
打印文本第一行 :
awk 'NR==1{print}' filename
打印文本第二行第一列 :
sed -n "2, 1p" filename | awk 'print $1'
获取第一列
ps -aux | grep watchdog | awk '{print $1}'
获取第一列,第二列,第三列
ps -aux | grep watchdog | awk '{print $1, $2, $3}'
获取第一行的第一列,第二列,第三列
ps -aux | grep watchdog | awk 'NR==1{print $1, $2, $3}'
获取行数NR
df -h | awk 'END{print NR}'
获取列数NF(这里是获取最后一行的列数,注意每行的列数可能是不同的)
ps -aux | grep watchdog | awk 'END{print NF}'
获取最后一列
ps -aux | grep watchdog | awk '{print $NF}'
对文件进行操作
awk '{print $1}' fileName
指定分隔符(这里以:分割)
ps -aux | grep watchdog |awk -F':' '{print $1}'
超出范围不报错
ps -aux | grep watchdog | awk '{print $100}'
查询可以登录的用户的用户名和UID
cat /etc/passwd | grep "/bin/bash" | awk '{FS=":"} {printf $1 "\t" $3 "\n"}’
这里“:”分隔符生效了,可是第一行却没有起作用,原来我们忘记了“BEGIN”条件,那么再来试试;
cat /etc/passwd | grep "/bin/bash" | awk 'BEGIN {FS=":"} {printf $1 "\t" $3 "\n"}’
cat /etc/passwd | grep "/bin/bash" | awk 'BEGIN {FS=":"} {printf $1 "\t" $3 "\t 行号:” NR "\t 字段数:" NF "\n"}’
#解释下awk命令
#开始执行{分隔符是“:”}{输出第一字段和第三字段输出行号(NR值)字段数(NF值)}
root 0 行号:1 字段数:7
user1 501 行号:2 字段数:7
如果我只想看看sshd这个伪用户的相关信息,则可以这样使用:
可以看到sshd 伪用户的UID是74,是/etc/passwd_文件的第28行,此行有7个字段
cat /etc/passwd | awk 'BEGIN {FS=":"} $1=="sshd" {printf $1 "\t" $3 "\t 行号:" NR "\t 字段数:" NF "\n"}’
标签:基本,输出,grep,用法,awk,分隔符,print,NR
From: https://blog.csdn.net/weixin_61753702/article/details/140867630