awk入门及进阶

awk入门部分

  awk不仅仅是linux系统中的一个命令,而且还是一种编程语言,可以用来处理数据和生成excel表格。处理的数据可以是一个或多个文件,可以是标注输入,也可以通过管道符获取标准输入。

  awk -F:指定awk按照什么样的标准进行文本切割,切割成一列一列的。如果不知道-F参数,awk默认按照空格进行文本切割。

  {}中的print代表输出的意思,

  $代表取列的意思,$1就是取第一列,以此类推,

  $0默认输出所有内容,

  $NF默认取每一行的最后一列。

 (1)awk '条件' 文件名

 例:awk '{print $1}' yunjisuan.txt

 (2)awk -F "分隔符号" '条件' 文件名

 例:awk -F ":" '{print $1}' yunjisuan.txt

 (3)awk [options] 'pattern {action}' file

  [options]:参数(如:-F)

  pattern:模式,模式就是条件,内容的查找范围,具有过滤作用,如果没有模式,默认输出某一列的所有内容。

  {action}:动作,动作是要干什么,针对过滤出的内容,如果没有动作,默认全部输出。

  例:awk -F ":" 'NR==3{print $1}' yunjisuan.txt

  分析:awk -F "[:/]+" 'NR==3{print $1}' yunjisuan.txt中"[:/]+"的含义:

 (1)"[:/]":表示":"和"/"都作为分隔符,分割时遇到":"和"/"都进行分割。

 (2)"[:/]+":"+"表示贪婪,也就是":"和"/"连在一起表示一个分隔符,即":/",而"[:/]+"中所含有的分隔符为":"、"/"、":/"这三个分隔符,分割时遇到这三个分隔符都进行分割。   awk -F 参数 'BEGIN{}模式{动作}ECD{}' 文件名

  BEGIN模块:告诉awk,数据要如何读。    ECD模块:告诉awk程序要如何结束。

  NR这个符号的真的含义不是行号,而是数据被awk读取一段以后,NR就会记录一次。由于awk默认以 作为每次读数据的结束标志,因此NR就恰好等于行号了。

  默认awk读入换行符和输出换行符都是 。

  我们可以通过BEGIN模块,再awk读取数据之前设定它的读入换行符是什么,也就是修改awk默认的读数据时的默认换行符。(RS:读入换行符,ORS:输出换行符)

  awk 'BEGIN{RS=":";ORS="|"}{print $1}' yunjisuan.txt

  sort:排序,默认按照26个英文字母从a到z排序

  sort -n:按数字排序

  sort -rn:逆转排序,数字按从大到小排序

  sort -k:指定第几列进行排序,如sort -k2,第二列进行排序

  uinq:去重,去掉重复的,字母不区分大小写

  uniq -c:去重计数

  tr:代替 

  例:(1)echo "1:2:3:4:5" | tr ":" "+"

          (2)1+2+3+4+5

  按照单词出现频率进行降序排序(计算文件中每个单词重复数量)

  sed -r '1,10s#[^a-zA-Z]+# #g' /etc/passwd>/server/files/count.txt

awk进阶部分

  awk的几种模式

  (1)正则表达式模式

  (2)比较表达式模式

  (3)范围模式

  (4)特殊模式BEGIN和END

  正则表达式模式:"~":表示进行正则匹配     awk '$5~/^r/' test

                             "!~":表示取反,用于表达与~相反的意思。

  比较表达式模式:例:awk 'NR>=23&&nr<==30' /etc/services

  范围模式:例:awk 'NR==2,NR==5{prnt NR,$o}' count.txt

  BEGIN和END模式:awk -F ":" 'BEGIN{我是开头}{print $0}END{我是结尾}' test

awk里变量都可以赋值,变量的初始值都是0。

awk 'BEGIN{a=2;b=3;print a+b}'

"/"代表除,"*"代表乘,"**"代表乘方,

计算文件内的行数:awk '{i=i+1}END{print i}' test   其中i=i+1等于i=++

计算文件内所有数字之和:awk '{i=i+$0}END{print i}' 文件名或文件路径

计算文件内所有数字之积:awk '{BEGIN{i+1}i=i*$1}END{print i}' 文件名或文件路径

awk数组的应用

awk 'BEGIN{h[10]="lx";h[11]="HS";h[12]="IZ";h[13]="hushi"; for(i in h) print i}'

for:循环                                         i:变量

in:在哪取值                                    h:数组

  

转载于:https://www.cnblogs.com/mhqy/p/9871471.html

原文地址:https://www.cnblogs.com/twodog/p/12135727.html