awk工作流程及基本使用
如果我想从一个文件当中获取一部分内容的话,那么我们就要利用到awk。awk可以从一个文本当中获取部分内容,或者对这个文本进行排版。
awk的工作过程是:它会把文件一行内容,读到内存里,然后对这行内容进行分段:
用法:awk '/范围/{命令1;命令2;......}' file,awk默认的分隔符是空格或者tab
用的比较多的命令print
-F:表示以冒号做个分隔符 显示第一块内容。$0表示整行内容。
刚才的命令是匹配root的,如果加上^匹配的是开头含有root。
这句命令的意思是查找第五部分含有root的,并打印第二部分。使用~可以表示匹配的意思。
awk实际上自带一个循环的。在第一行开始之前,实际上我们是可以先做一些准备工作的,也就是说,awk再把第一行读入到内存之前,可以先做其他的一些操作:
awk 'BEGIN{命令}/范围/{命令1;命令2;......}' file
刚才说了awk默认的分隔符是空格,这个分隔符使用的是FS这个变量:
这个命令的意思是在读取passwd这个文件之前,首先执行BEGIN里面的命令,BEGIN里面我们定义了一个变量FS。FS就是读取文件时默认的分隔符。
如果我们想输出多个部分的话,用逗号(,)隔开。当我们使用逗号隔开时,显示在屏幕上是以空格隔开的。
默认输出分隔符是空格,我如何更改输出分隔符?OFS
awk 'BEGIN{FS=":";OFS='/'} $1 ~ /root/{print $1,$2}' passwd
有BEGIN就会有END,END就是扫尾的意思。
awk 'BEGIN{命令}/范围/{命令1;命令2;......}END{命令}' file
当我们使用print的时候,print后面如果是变量名我们可以不使用双引号"",如果不是变量名的话,就必须使用""引起来。
刚才我们已经说了2个变量FS,OFS。
NF:表示每行的字段数。
NR:表示awk所处理的这行内容在源文件当中是第几行:
这句命令显示了开头为root的那行内容在源文件当中是 第一行。
除了系统自带的这些变量之外,我们还可以自定义变量的:
该命令的意思是在循环passwd文件之前,定义了一个变量aa值为0,然后循环aa里面的内容,如果含有root的话,那么给变量aa加1。最终把所有的行全部读完之后,再执行END里面的命令。
注意:当我们引用变量的时候,是不加$的,这个和shell或者其他语言不一样。