awk 基本用法

学习简介:

awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。


内容:

模式,模式可以是以下任意一种
  1. 正则表达式:使用通配符的扩展集
  2. 关系表达式:使用运算符进行操作,可以是字符串或数字的比较测试
  3. 模式匹配表达式:用运算符~匹配和~!不匹配
  4. 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"}’
  • 14
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值