zoukankan      html  css  js  c++  java
  • linux之awk命令

    一、awk的内置参数

    $0:表示整个当前行

    $1:每行第一个字段

    $2:每行第二个字段

    $n:每行第n个字段

    awk的参数:分隔符

      -F separator 设定分隔符(默认为空格)  

    打印单个字段:

    awk -F ':' '{print $3}'   /etc/passwd

    打印多个字段:

    awk -F ':' '{print $1,$3}'  /etc/passwd

    awk -F ':' '{printf("User:%s      UID:%s ", $1,$3)}'  /etc/passwd

    awk -F ':' '{print "User:" $1 " "UID:"$3"}'  /etc/passwd

      NR:每行行号

      NF:字段数量

    awk -F ':' '{print NR,NF,FILENAME}' /ect/passwd

    #案例:

    1、显示/etc/passwd 中用户名ID大于100的行号和用户名

    awk -F ":" '{if ($3>100) print NR,$1}' /etc/passwd

    awk -F ":" '$3>100{print NR,$1}' /etc/passwd

    2、在服务器的日志中找出IP:43.226.164.120 的访问日期。

    sed -n '/43.226.164.120/p' assess_log | awk ' ' '{print substr($4,2)}' 

    awk '/43.226.164.120/{print substr($4,2)}' assess_log

    二、awk的逻辑判断式:

    • ~     匹配正则表达式
    • !~ 不匹配正则表达式
    • ==等于
    • !=不等于
    • < 小于
    • >大于

    awk -F ':' '$1~/^m.*/{print $1}' /etc/passwd   打印以m开头的用户名

    awk -F ':' '$1!~/^m.*/{print $1}' /etc/passwd  不打印以m开头的用户名

    三、awk的扩展格式

    command扩展

       BEGIN{print "start"}pattern{awk命令}END{print "end"}

    #案例:制表显示/etc/passwd 每行的行号,每行的列数,对应行的用户名

    awk -F ':' 'BEGIN {"User     Line    Col"}{print $1,NR,NF}END{print  "-------------"FILENAME"-------------"}'  /etc/passwd

    #案例:统计当前文件夹下的文件/文件夹占用的大小

    ls -al | awk 'BEGIN{count=0}{count+=$5}END{print count}'

    ls -al | awk 'BEGIN{count=0}{count+=$5}END{print count/1024/1024"M"}'

    #统计显示/etc/passwd的账户总人数

    awk -F ':'  'BEGIN{count=0}{count++}END{print count}' /etc/passwd

    awk -F ':'  'BEGIN{count=0}$1!~/^$/{count++}END{print count}' /etc/passwd 排除空行

    #统计显示/etc/passwd中UID中大于100的用户名

    awk -F ':'  '$3>100{print $1}'  /etc/passwd

    awk -F ':' 'BEGIN{count=0}$3>100{user[count++]=$1}END{for(i=0;i<count;i++) print i,user[i]}'  /etc/passwd

    #统计access_log日志中每个IP出现的次数

    awk '{arr[$1]++}END{for(key in arr)print key,arr[key]}'  access_log

    awk和sed对比

    1、awk和sed都可以处理文本

    2、awk侧重于复杂逻辑处理

    3、sed侧重于正则处理

    4、awk和sed可以共同使用

    面试问题

    1、修改某个目录下所有包含AAA的文件的文件名  改为 aaa【改文件名】

    find . -name "*aaa*"  -exec rename aaa AAA  { } ;

    2、修改目录下所有的文件中,包含 aaa 都改成 AAA【改文件内容】

     sed -i  's/AAA/aaa/g' `grep AAA -rl . `  反引号

    sed本身不改变文件内容,要使用-i,然后看下文件

  • 相关阅读:
    列表 查找元素二分查找
    文件的追加
    Syste.IO 类介绍
    Ctack堆栈
    判断文件是否存在(Exists)
    复杂排序
    元素出栈和入站
    HTML文档中meta标签的作用 Generator KEYWords DEscription Author httpequiv属性
    Page.ClientScript.RegisterClientScriptBlock 失效
    用户名只能由字母或者数字组成(用户控件与HTML控件)
  • 原文地址:https://www.cnblogs.com/wuzm/p/10956216.html
Copyright © 2011-2022 走看看