博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux中awk的使用
阅读量:4684 次
发布时间:2019-06-09

本文共 2982 字,大约阅读时间需要 9 分钟。

在linux中awk绝对是核心工具,特别是在查找搜索这一领域,和掌握sed命令一样重要

 

下面为awk的一些基本知识,基于这些知识,可以让你随意操控一个文件:

在awk中:()括号为条件块,{}为执行的命令块

一般情况下awk有这几部分组成:

awk 'BEGIN{}(){}END{}' file

BEGIN为初始化操作,中间为对file文件中每一行的处理,END块中为最后的输出

当然,awk不是必须这3个都有,也不是缺少谁就不行的。可以只有BEGIN,也可以只有END

 

print命令

打印文件内容
awk '{print}' datafile

 

-f参数

执行awk脚本,如脚本为hello.awk
awk -f hello.awk datafile

 

$number

表示记录的字段,其中$0表示整个串

 

FS

表示字段分隔符,如下以逗号作为分隔符
awk 'BEGIN{FS=","}{print}' datafile
当写脚本文件时,一般用FS

 

-F参数

同FS作用一样,设置分隔符,如
awk -F "," '{print $1}' datafile

 

NF

表示当前记录行中的字段数量

 

NR

表示当前记录的编号,即行号

 

FNR

当前浏览文件的记录数

 

FS="\t+"

表示以一个或多个制表符作为分隔符

 

OFS

字符分隔符,俩个字段间插入分隔符

 

RS

记录分隔符,即一行的分隔符

 

ORS

输出记录分隔符,俩个记录间(行)插入

 

OFMT 数的输出格式

CONVFMT 数值的内部转换格式

 

布尔表达式

awk -F "," '$1=="Hello" {print $1}' datafile
只有第一个参数值为Hello时,才打印第二个

 

length(string1)

返回string1长度

 

index(string1,string2)

返回string2在string1中的位置,没有返回0

 

tolower(string1)/toupper(string1)

返回大小写

 

substr(string1,5,3)

从string1的第5位置开始截取长度为3的字段

 

match(string1,/you/),RSTART,RLENGTH

match匹配的是一个正则表达式
RSTART返回第一个匹配的位置
RLENGTH指定他占据的字符跨度,没有为-1

 

gsub/sub(/My/,"You",string1)

gsub全局替换,sub只替换第一个
如上为在string1中查找My并替换为You

 

split(string1,strarray,",")

print strarray[1],strarray[numelements]
把string1以逗号分割,并传入到strarray组中
从1开始编号

 

删除重复行(必须先排序)

sort  datafile|awk '{if($0!=line)print;line=$0}'

 

FILENAME

awk中特殊存在,用于表示文件
awk 'END{print FILENAME}' datafile
打印file名字
若有多个输入文件则可以用于判断,如:
awk 'if(FILENAME=="file1"){arr[$3]=$1}else{($1 in arr){print arr[$1]"|"$2}} file1 file2
注意:awk先处理前面文件再处理后面文件

 

ARGIND

当前被处理参数标记

 

ARGC

命令行参数个数

 

ARGV

命令行参数排列

 

ENVIRON

支持队列中环境变量的使用

 

next

下一个命令不执行
awk '(NR%2=1){next}{print}' f1
awk 'NR==FNR{a[$0]=$0;next}a[$0]{print a[$0],$0}

 

nextfile

中断当前文件处理,进入下个文件处理:
awk '{print FILENAME;nextfile} f1 f2
打印俩个文件名,多用于查找文件

 

exit

停止awk,并执行END语句块后退出

 

定义函数:

awk '{print "sum=",sqrtsum($1,$2)}function sqrtsum(x,y){return x*x+y*y}' file
awk '{print "sum=",$1*$1+$2*$2}

 

-v

加载环境或shell中的参数
awk-F \| -v ORAHOME=${ORA_HOME} '{print $1"|"ORAHOME>"datafile1"} datafile
或者如下:
awk-F \|  '{print $1"|"ORAHOME>"datafile1"} ORAHOME=${ORA_HOME} datafile

注:若在BEGIN中使用环境变量,则必须使用-v模式

 

getline

获取文件的行内容,一般放在BEGIN中
一个getline获取一行,也可以保存到变量
awk 'BEGIN{getline var1}END{print var1}' file

 

打印5行之后的行:

awk 'NR>5' file
打印2到6行:
awk 'NR==2,NR==6' file
打印前5行:
awk '!(NR>5)' file
awk 'NR<6' file
打印5倍数的行:
awk '(NR%5==0){print}' file
awk '!(NR%5){print}' file

 

awk中相关操作符使用

~操作符

俩边匹配符,可模糊比较,如:
awk 'BEGIN{FS="|"}($2~/..My./){print}' file

表示在第二个字段中包含5个字符,其中第3、4个字符为My的行

比较运算符

==俩边相等
>
>=
<
<=
!=俩边不等
~ 匹配正则表达式
!~ 不匹配正则表达式
‖逻辑或
&& 逻辑与

算术运算符

+      加法
-       减法
*      乘法
/      除法
^     指数算法
%    模算法
--     自-1(前后自减)
++   自+1(前后自加)
+=    自加算法
-=      自减算法
*=      自乘算法
/=      自除算法
^=     自指数算法
%=    自模算法

统计文本中空行数量

awk 'BEGIN{x=0}/^$/{x+=1}END{print x}' datafile
/^$/表示空行

正则表达式:

\      转义符
^      行首符
$      行尾符
.        匹配一个字符
[ ]      匹配其中一个字符
|        或操作
( )     判断语句
*       匹配0个或多个前面的字符
+      匹配前面一个或多个字符
?      匹配模式出现频率

 

if语句
if($1=="foo"){
    print "foo"
}else if($1=="bar"){
    print "bar"
}else{
    print "other"
}

 

do..while语句

{
count=6
do{
     print count
     count--
    }while(count!=1)
}

 

while语句

{
while(x<NF){
     print $x
     x++
   }
}

for语句
for(x=1;x<=5;x++){
    print x
}

 

转载于:https://www.cnblogs.com/watertaro/p/9221054.html

你可能感兴趣的文章
选拔赛 I 点进来吧,这里有你想要的
查看>>
SQL 优化经验总结34条
查看>>
开源 视频会议 收藏
查看>>
核心J2EE模式 - 截取过滤器
查看>>
test1
查看>>
常见反函数、反函数导数(微分)公式
查看>>
【物理】概念的理解 —— 蒸馏、萃取
查看>>
洛谷P2002消息扩散
查看>>
TP框架中field查询字段
查看>>
arm-linux-gcc
查看>>
LeetCode 36 Valid Sudoku(合法的数独)
查看>>
抓其根本(一)(hdu2710 Max Factor 素数 最大公约数 最小公倍数.....)
查看>>
k-window的关闭与打开设置
查看>>
SpringMVC学习系列(6) 之 数据验证
查看>>
二、如何通过URL获取其他网页源代码内容(火狐插件扩展开发教程)
查看>>
重构sql server的sys.sp_helptext存储
查看>>
浅谈JavaWeb架构演变
查看>>
遍历hashMap的两种方式
查看>>
ACM数论-素数
查看>>
Codeforces Round #464 (Div. 2) B. Hamster Farm[盒子装仓鼠/余数]
查看>>