• Linux文本三剑客---awk


    AWK是什么

    Linux文本三剑客之一(grep,sed,awk),功能最强大的文本工具。

    逐行读取输入的文本内容,默认以空格和tab键作为分隔符。但是多个空格或者tab键的空格,会自动压缩成一个,然后按照指定的模式和条件执行编辑命令

    可以在免交互的情况下,实现复杂的文本操作。完成自动化配置。

    awk格式

    awk '操作符 action' file

    操作符:想干啥

    action:怎么做

    file:处理对象 

    例如:

    awk 'BEGIN{x=1};{x++};END{处理动作}' 文件名

    awk '操作符 {处理动作}' 文件名

    {}外部表示定义条件

    {}内指定操作

    BEGIN对条件做初始化操作

    for ((i=1;i<=10;i++))

    awk常用选项

    -F:指定分隔符,如果是空格,tab键,可以不加

    -v:变量赋值,awk无法从外部获取变量

    awk的内置变量:

    NR:需要处理行号

    FS:列分隔符 和F作用一致,如果用FS,则  FS=":"

    OFS:输出内容的列分隔符

    NF:表示最后一个字段

    $n:内置变量

    awk '{print NR}' /etc/passwd

    显示行号

    awk '{print NR $0}' /etc/passwd

    显示行号和内容

    awk 'NR==3,NR==5{print}' /etc/passwd

    第三行和第五行

    awk 'NR==3;NR==5{print}' /etc/passwd

    第三行到第五行

    awk '(NR>=3)&&(NR<=5){print}' test.txt

    第三行到第五行

    awk 'NR%2==0{print}' test.txt

    打印偶数行

    awk 'NR%2==1{print}' test.txt

    打印奇数行

    awk的运算--求幂运算

    [root@hj ~]# awk 'BEGIN{print 2^3}'

    8

    [root@hj ~]# awk 'BEGIN{print 2**3}'

    8

    awk按行取列(最重要)

    1. awk -F: '{print $2,$NF}' /etc/passwd
    2. 大写的NF为最后一列
    3. $x:第几列

    表示打印第二列和最后一列

    AWK的精确筛选

    $n (> < ==);进行数值对比

    $n~"字符串" 代表这个字段包含某个字符串

    $n!~"字符串" 代表这个字段不包含某个字符串

    $n=="字符串" 代表这个字段要和字符串相同

    $n!="字符串" 取反,不为某个字段

    $NF:代表最后一个字段

    下面举几个例子方便大家理解:


    1./etc/passwd 输出最后一个字段中包含bash所在行的第一个字段和最后一个字

    awk -F: '$NF~"bash" {print $1,$NF}' /etc/passwd

    2./etc/passwd 只有第一列是root的行,才打印他的第六行

    awk -F: '$1=="root" {print $6}' /etc/passwd

    3.输出最后一个字段,不包含bash,打印第一列和第六列

    awk -F: '$NF~"bash" {print $1,$6}' /etc/passwd

    需要注意:

    ~:是包含的意思

    ==:为“是”的意思

    二者有很大区别

    4.指定第6个字段为/home/hj 而且最后一个字段为/bin/bash 满足条件的输出第一列和最后一列

    awk -F: '($6=="/home/hj")&&($NF=="/bin/bash") {print $1.$NF}' /etc/passwd

    条件判断打印

    结合if语句使用

    if $3>500 打印所有

    AWK三元表达式

    awk三元表达式继承了java,格式和Java也一样

    awk '{条件表达式1 ? A表达式或者值:B表达式或者值}' 文件名

    awk -F: '{max=($3>=$4)?$3:$4;{print max $0}}' /etc/passwd

    ?:

    if else

    if [ $3>=$4 ]

    then

    echo $3

    else

    echo $4

    fi

    文本内容匹配打印

    打印/etc/passwd中以root开头的行

    awk '/^root/{print}' /etc/passwd

    getline函数:getline和管道符以及重定向符号在一块的时候,才有特殊功效

    重定向:<> 把其中一个文件的内容传给另外一个

    | :输出指定内容,先到定义的变量,再由getline调用变量当中的内容,最后打印出结果。

    getline函数运行之后,会改变awk的内置变量,读取的行数也会发生变化,getline在前,就是第一行跳过,打印第二行

    getline在后,从第一行开始,跳过第二行,打印的就是奇数

    -v给变量赋值

    BEGIN模式

    对变量初始化。需要初始化变量的时候才会使用

    格式

    awk 'BEGIN{x=1};{x++};{print x}' test.txt

    对行数计算

    awk和数组结合使用

    awk中如何定义数组

    原理:索引的下标是唯一的

    a是遍历了所有数组,把结果赋值给i,i在下面继续

    本章结束,

    下面有几个实例可供参考:

    1.日志分割:

    2.

    free 内存监控

    df -h 磁盘监控

    top 动态进程监控

    top -b -n 1静态

    监控内存的百分比(不超过90%,超过警报),磁盘(不超过80%),进程(75%),写成函数库,以定时任务的方式每天早上十点整执行,

    函数库调用实现

  • 相关阅读:
    Window系统安装Lua
    深度学习100例 —— 循环神经网络(RNN)实现股票预测
    go学习(四、面向接口)
    kafka生产者发送消息报错 Bootstrap broker localhost:9092 (id: -1 rack: null) disconnected
    centos - 配置yum仓库
    解决传统难题,WMS系统实现信息数据实时追踪
    基于FPGA的IIR滤波器的实现(1)— MATLAB函数实现
    FlinkSql中的窗口
    js数据结构(队列Queue)
    MapReduce程序设计2
  • 原文地址:https://blog.csdn.net/qq_51506982/article/details/133552282