Linux(第二十五篇)三剑客之awk

awk
工作原理:

sed命令常用于一整行的处理,而awk比较倾向于将一行分成多个“字段”然后再进行处理,

且默认情况下字段的分隔符为空格或 tab 键。

awk 执行结果可以通过 print 的功能将字段数据打印显示

awk的基本格式及其内置变量:

awk 选项 '模式或条件 {操作}' 文件1 文件2...

-F “分隔符” 指明输入时用到的字段分隔符,默认的分隔符是若干个连续空白符

-v(小v) var=value 变量赋值

注意一定是单引号:'模式或条件 {操作}'

{ }外指定条件,{ }内指定操作。

用逗号指定连续的行,用 || 指定不连续的行。&&表示”且“。

内建变量,不能用双引号括起来,不然系统会把它当成字符串。

内置变量

$0:当前处理的行的整行内容

$n:当前处理行的第n个字段(第n列)

NR:当前处理的行的行号(序数)

NF:当前处理的行的字段个数。$NF代表最后一个字段

FS:列分割符。指定每行文本的字段分隔符,输入内容的分隔符,默认为空格或制表位。与"-F"作用相同 用-F可以不加单引号 -F:,用FS必须用=" "

OFS:输出内容的列分隔符

RS:行分隔符。

查看:

awk '{print}' (打印所有内容)

awk '{print $1}'  (打印第1列内容)

awk '{print NR}' (只打印行号)

awk '{print NR;$0}' (打印行号和内容)

awk 'NR==3{print}'  (打印第3行内容)

awk 'NR==3,NR==5{print}' (打印第3行到第5行内容)

awk 'NR==3;NR==5{print}' (打印第3行和第5行内容)

awk 'NR%2==0{print}' (打印偶数行)

awk 'NR%2==1{print}' (打印奇数行)

awk '/^root/{print}' (以root为开头的打印出来)

awk '/bash$/{print}'  (以bash为结尾的打印出来)

计算:

awk 'BEGIN{print 100+1}' (加减乘除,整数小数运算)

awk 'BEGIN{print 2**3/2^3}'  (幂运算)

result=(awk 'BEGIN{printf '%.2f' '2.123*3.123'}') echo $result (取小数点后两位)

result=(awk 'BEGIN{printf '%.F' '2.123*3.123'}') echo $result  (整数运算)

getline:

awk '{getline;print $0}' (偶数行)

awk '{print $0;getline}'   (奇数行)

awk '{getline < 'test1.txt' ; print $0 > 'test2.txt' }' test1.txt (把test1.txt的内容给getline再打印出来给test2.txt)

ls | awk '{getline line ; print $0,line;}' (把查看的给line再打印出来)

BEIGIN模式指定BEGIN打印模式:


格式:awk 'BEGIN{...};{...};END{...}' 文件

处理过程:

1、在awk处理指定的文本之前,需要先执行BEGIN{...}模式里的命令操作

2、中间的{...} 是真正用于处理文件的命令操作

3.在awk处理完文件后才会执行END{...}模式里的命令操作。END{ }语句块中,往往会放入打印结果等语句。

x的变量范围是根据文本中内容的行数来的

 awk -F: '{print $1}'  (以冒号为分割,打印第一列)

换行:

echo $PATH | awk -v RS=':' '{print $0}' 

echo $PATH | sed -n 's/:/\n/gp'

echo $PATH | tr -s ':' '\n'

awk的三元表达式与精准筛选用法:

格式:awk '(条件表达式)?(A表达式或者值):(B表达式或者值)'

以:为分隔符,如果$3大于$4,则打印$3,否则打印$4

awk -F: '{max=($3>=$4) ?$3:$4;{print max,$0}}' (?:是if 和else的意思)

awk的精准筛选:

$n(> < ==): 用于对比数值

$n~"字符串": 代表第n个字段包含某个字符串

$n!~"字符串": 代表第n个字段不包含某个字符串

$n=="字符串": 代表第n个字段为某个字符串

$n!="字符串": 代表第n个字段不为某个字符串

$NF: 代表最后一个字段
 

指定输出的分隔符:

awk 'BEGIN{OFS==':'};{$1=$1;print $0}' (把冒号换成\n 打印所有的行和内容)

echo a b c | tr -s " " ":"

echo a b c | sed -n 's/ /:/gp'

数组

定义数组打印

 awk中的数组形成遍历,在awk中打印变量不需要加$

数组去重

  1. 索引号可以是数字,字符

  2. 统计索引号出现的次数

  3. 遍历行数

索引号是文本里面的内容,对索引号进行计数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值