• Linux三剑客之awk命令


      awk是一种模式扫描和处理语言,它是功能非常强大的文档编辑工具,它不仅可以以行为单位,还能以列为单位进行文件处理。下面以以下三个方面来学习它:

    • 格式详解
    • 简单实践
    • 进阶实践

    一、格式详解

     1、命令格式

    • awk [参数] '[动作]' [文件名]

    2、常用参数

    • -F 指定列的分隔符
    • -f 调用脚本
    • -v 定义变量

    3、常用动作

    动作有三部分组成,分别是:

    • BEGIN(命令) 初始代码块,主要和命令相关
    • /pattern/(命令)匹配,执行代码块
    • END(命令)结束代码块,主要和信息输出相关

    常用的动作有print (显示内容):

    • $0 显示当前行所有内容
    • $n 显示当前行的第n列内容,如果有多列,中间以逗号隔开

    4、内置变量

    当然该命令还可以使用如下的一些内置变量:

    • FILENAME 只读变量,当前输入文件的文件名
    • NR 指定显示行的行号
    • NF 输出最后一列的内容
    • OFS 指定输出列的分隔符,缺省是空格
    • FS 输入文件的列的分隔符,缺省是空格和tab

    二、简单实践

     1、内容查看

    # 文件内容
    [root@localhost thrid_dir]# cat awk.txt 
    aa AA AA1
    aa BB BB1
    cc CC CC1
    
    # 查看文件全部列'{print}'相当于'{print $0}'
    [root@localhost thrid_dir]# awk '{print}' awk.txt 
    aa AA AA1
    aa BB BB1
    cc CC CC1
    
    # 查看第一列内容
    [root@localhost thrid_dir]# awk '{print $1}' awk.txt 
    aa
    aa
    cc
    
    # 查看第1,3列内容
    [root@localhost thrid_dir]# awk '{print $1,$3}' awk.txt 
    aa AA1
    aa BB1
    cc CC1
     
    # 查看第1,3列内容
    [root@localhost thrid_dir]# awk '{print $1$3}' awk.txt 
    aaAA1
    aaBB1
    ccCC1
    
    # 查看行号,1,3列内容
    [root@localhost thrid_dir]# awk '{print NR,$1,$3}' awk.txt 
    1 aa AA1
    2 aa BB1
    3 cc CC1
    
    # 查看正则内容
    [root@localhost thrid_dir]# awk '/aa/' awk.txt 
    aa AA AA1
    aa BB BB1

    2、参数实战

    • -F

    awk默认指定的列分隔符是空格,如果对于/etc/password文件就不能取出对应的列,因为中间是以':'分隔,所以需要指定分隔符。

    [root@localhost thrid_dir]# cat /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    ...
    [root@localhost thrid_dir]# awk -F ':' '{print $1}' /etc/passwd
    root
    bin
    daemon
    adm
    lp
    sync
    shutdown
    ...
    • -f

    编写脚本,进行格式化。

    # 编写format格式文件
    [root@localhost thrid_dir]# cat format 
    /aa/{print "" NR "行:" "内容:" $0}
    
    # 加载格式文件
    [root@localhost thrid_dir]# awk -f format awk.txt 
    第1行:内容:aa AA AA1
    第2行:内容:aa BB BB1
    • -v
    # 传入单值
    [root@localhost thrid_dir]# echo | awk -v var=10 '{print var}' 
    10
    
    # 传入多值
    [root@localhost thrid_dir]# echo | awk '{print v1,v2}' v1=100 v2=200 
    100 200

     3、动作实战

    动作是由三部分组成的,下面说明一下BEGIN和END是如何简单使用的,比如格式化输出:

    # 文件内容
    [root@localhost thrid_dir]# cat awk.txt 
    aa AA AA1
    aa BB BB1
    cc CC CC1
    
    # 指定分隔符输出
    [root@localhost thrid_dir]# awk 'BEGIN{OFS=":"}{print NR,$1,$2}' awk.txt 
    1:aa:AA
    2:aa:BB
    3:cc:CC
    
    # 指定样式输出
    [root@localhost thrid_dir]# awk 'BEGIN{print "--开始输出--"}{print NR,$1,$2}END{print "--结束输出--"}' awk.txt 
    --开始输出--
    1 aa AA
    2 aa BB
    3 cc CC
    --结束输出--

    三、进阶实战

     1、fi语句

    输出/etc目录中大于500字节的普通文件:

    • 过滤出字节大于500
    • 普通文件
    [root@localhost etc]# ll /etc/ | awk '{if (($5>500 && /^-/)) print "文件类型:" $1,"	文件大小:"$5,"	文件:"$9}'
    文件类型:-rw-r--r--.     文件大小:1518     文件:aliases
    文件类型:-rw-r--r--.     文件大小:12288     文件:aliases.db
    文件类型:-rw-------.     文件大小:541     文件:anacrontab
    文件类型:-rw-r--r--.     文件大小:2853     文件:bashrc
    文件类型:-rw-r--r--.     文件大小:1165     文件:chrony.conf
    文件类型:-rw-r--r--.     文件大小:1620     文件:csh.cshrc
    文件类型:-rw-r--r--.     文件大小:841     文件:csh.login
    文件类型:-rw-r--r--.     文件大小:5090     文件:DIR_COLORS
    ...

    awk中的if语句格式:

    • awk 参数 '{if语句 print语句}'

    2、for语句

    [root@localhost ~]# echo 'abcdefgh'|awk -F '' '{for(i=1;i<=NF;i++) print $i}'a
    b
    c
    d
    e
    f
    g
    h

    awk中的if语句格式:

    • awk 参数 '{for语句 print语句}'
    作者:iveBoy
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    LabVIEW入门第三天(软件及驱动包下载)
    poj1732
    poj1722
    poj1821
    poj1770
    poj1949
    poj1726
    poj1699
    poj1682
    poj1853
  • 原文地址:https://www.cnblogs.com/shenjianping/p/14392140.html
Copyright © 2020-2023  润新知