加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

awk使用

发布时间:2020-12-14 01:40:07 所属栏目:Linux 来源:网络整理
导读:1,基础语法 $ gawk ‘BEGIN {print "Hello World!"} {print $0} END {print "byebye"}‘ passwd 内建变量 $0 整条记录 $1 记录中的第1个数据字段 $2 记录中的第2个数据字段 $n 记录中的第n个数据字段 FIELDWIDTHS 一列由空格分隔的数字,定义了每个字段具体
1,基础语法
$ gawk ‘BEGIN {print "Hello World!"} {print $0} END {print "byebye"}‘ passwd
内建变量
$0 整条记录
$1 记录中的第1个数据字段
$2 记录中的第2个数据字段
$n 记录中的第n个数据字段
FIELDWIDTHS 一列由空格分隔的数字,定义了每个字段具体宽度
FS 输入字段分隔符
RS 输入记录分隔符
OFS 输出字段分隔符
ORS 输出字段分隔符

ARGC 当前命令行参数个数
    ARGIND 当前文件在ARGV中的索引
    ARGV 包含命令行参数的数组
    CONVFMT 数字的转换格式(参见printf语句),默认值为%.6g
    ENVIRON 由当前shell环境变量及其值组成的关联数组
    ERRNO 当读取或关闭输入文件发生错误时的系统错误号
    FILENAME 用作gawk输入的数据文件的文件名
    FNR 当前数据文件中的记录数
    IGNORECASE 设成非零时,忽略gawk命令中出现的字符串的字符大小写
    NF 数据文件中的字段总数
    NR 已处理的输入记录数
    FNR  文件记录数
    OFMT 数字的输出格式,默认值为%.6g
    RLENGTH 由match函数所匹配的子串的长度
    RSTART 由match函数所匹配的子串的起始位置
    next:
    提前结束对本行处理而直接进入下一行处理(awk自身的循环)
基本使用:
Awk –Fs  ‘/pattern/ {action}’ input-file
(或者)
Awk –Fs ‘{action}’ input-file

-F 为字段分界符。如果不指定,默认会使用空格作为分界符。
/pattern/和{action}需要用单引号引起来。
/pattern/是可选的。如果不指定,awk 将处理输入文件中的所有记录。如果指定一个模式,awk 则只处理匹配指定的模式的记录。

awk ‘BEGIN {FS=”,”} {print $2,$3}’ employee.txt
awk  ‘BEGIN {print "test1","test2"}‘   不使用逗号分隔test1与test2时,awk 将不会使用 OFS,其输出变量之间没有任何空格

2,变量
Awk 变量以字母开头,后续字符可以是数字、字母、或下划线。关键字不能用作 awk 变量,可以直接使用而不需事先声明。如果要初始化变量,最好在BEGIN 区域内作,它只会执行一次。 使用-v 声明或直接使用。

数组:
     array[index-expression]
     index-expression:
(1) 可使用任意字符串;字符串要使用双引号括起来
(2) 如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为“空串”
(3) 若要判断数组中是否存在某元素,要使用“index in array”格式进行遍历

printf 输出格式

格式化输出:printf “FORMAT”,item1,item2,.
   (1) 必须指定FORMAT
   (2) 不会自动换行,需要显式给出换行控制符,n
   (3) FORMAT中需要分别为后面每个item指定格式符

4 正则表达式的匹配

操作符             描述
                                    ~                       匹配
                                !~                     不
                                例如 :
                                awk  -F:  ‘ $1 ~ "ro" ‘  passwd        第一个字段包含ro

5,行范围的限定
awk -F: ‘/^root&;/,/^nobody&;/ {print $1}‘ /etc/passwd
awk -F: ‘(NR>=10&<=20){print NR,$1}‘ /etc/passwd (小括号加不加都行)

6 ,结构化命令
if
单条语句
if(conditional-expression ) {statements ;.......}

多条       
    if (conditional-expression)
    {
        action1;  #依次执行
        action2;
    }

    if   else  
    if (conditional-expression)
        action1
    else
        action2

        if(condition) {statements;…} else {statements;…}

     三元操作符
     codintional-expression ? action1 : action2 ;

     while  
     while (codition)
            {                   

               Actions

              }

            while(conditon) {statments;…}    

      do-while  

      do
    {           
        action
      }        
     while(condition)

        for 

        for(initialization;condition;increment/decrement)
            for(expr1;expr2;expr3) {statements;…}

            if-then-else语句:
         if (condition) statement1; else statement2
        while语句:
         while (condition)
         {
         statements
         }
        do-while语句:
         do {
         statements
         } while (condition)
        for语句:
         for(variable assignment; condition; iteration process) 

    常用示例:

  seq  10 | awk  ‘i=0{print  $0}‘     i=0不打印
  seq  10 | awk  ‘i=1{print  $0}‘     =1  打印  与大括号无关
  seq  10 | awk  ‘i=!i{print i,$0}‘   开始i未赋值,!i 为真(即1),打印,之后为假(0),不打印,只打印奇数行
  seq  10 | awk  ‘!(i=!i){print i,$0}‘  同上,打印偶数行

         磁盘利用率大于10%并显示
   df  -h  | awk  -F "[[:space:]]+|%"  ‘/^/dev/sd/{  if ($5>10)  print  $1,$5}‘

   awk  ‘/^[[:space:]]*linux16/  {i=1;while (i<= NF) {print $i,length($i);i++} }‘  /boot/grub2/grub.cfg

        100累加
        awk  ‘BEGIN{sum=0; for (i=1;i<=100;i++){ sum+=i}  print sum  }‘

        查看本机tcp 连接的状态数

  netstat -tan | awk ‘/^tcp/  {state[$NF]++}  END{for(i in state) { print i,state[i]  }} ‘
 awk ‘{split($5,ip,":");count[ip[1]]++;print ip[1],"链接数",count[ip[1]]}‘  ss.log |  sort  -nr  -k 3 | head 
 awk   -F "[[:space:]]+|:"  ‘{ ip[$6]++}END{for(i in ip) { print "summery",i,"links ",ip[i] } }   ‘  ss.log  | sort  -nr  -k4  

        access.log  取前十ip  
awk  ‘{ip[$1]++} END{for (i in  ip ){print  i,"连接数 " ip[i]}} ‘  access_log   | sort  -nr  -k 3   | head 

    取随机数

awk ‘BEGIN{srand(); for(i=1;i<=10;i++){print rand()} }‘
awk ‘BEGIN{srand(); for (i=1;i<=200;i++) { if (i==200 ) {printf "%d",int(rand()100) ;}else {printf "%d,",int(rand()100) }} }‘ >> soho.txt

取随机数并找到最大最小数
    awk  -F ","    ‘ { MAX=$1;MIN=$1;  for (i=1;i<=NF;i++) {if  ( $i>= MAX  ) { MAX=$i } ;  if ( $i <= MIN) {  MIN=$i }  }  }  END{ print  "MAX=",MAX,"MIN=",MIN } ‘  soho.txt

字符串操作
? length([s]):返回指定字符串的长度
? sub(r,s,[t]):对t字符串搜索r表示模式匹配的内容,并将第一个匹配内容替换为s
echo "2008:08:08 08:08:08" | awk ‘gsub(/:/,"-",$0)‘

    用awk命令,计算当前目录下文件大小的总和
find  .     -maxdepth 1   -type  f -ls   | awk  ‘{sum+=$7}  END {print  sum} ‘

    统计链接到本地数最大的IP10个

     netstat  -an  | head   | awk  -F "[[:space:]]+|:"   ‘ NR> 2 {print $6}‘

     netstat  -an  | head   | awk  -F "[[:space:]]+|:"   ‘ NR> 2 {ip[$6]++}  END{for (i in ip ) print i,ip[i] }‘ | sort -nr -k 2|head

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读