zoukankan      html  css  js  c++  java
  • Linux之awk、变量、运算符、if多分支

    一.awk语法

    awk [options] 'commands' files
    option
    -F 定义字段分隔符,默认的分隔符是连续的空格或制表符
    使用option中的-F参数定义间隔符号
    用$1,$2,$3等的顺序表示files中每行以间隔符号分隔的各列不同域
    NF变量表示当前记录的字段数
    -v 定义变量并赋值 也可以借用次方式从shell变量中引入

    二.变量

    变量命名规则

    以字母或下划线开头,剩下的部分可以是:字母、数字、下划线.

    最好遵循下述规范:

    1.以字母开头
    2.使用中划线或者下划线做单词的连接
    3.同类型的用数字区分
    4.对于文件最好加上拓展名


    NR 表示AWK读入的行数
    FNR表示读入行所在文件中的行数
    # awk '{print NR,FNR,$1}' file1 file2 
    1 1 aaaaa
    2 2 bbbbb
    3 3 ccccc
    4 1 dddddd
    5 2 eeeeee
    6 3 ffffff
    #
    逻辑运算 可直接引用域进行运算
    == >= <= != > < ~ !~
    # awk 'NR==1 {print}' /etc/passwd
    root:x:0:0:root:/root:/bin/bash

    命令 {print $0}
    读后处理 END {awk_cmd1;awk_cmd2;}

    NR 当前记录的个数(全部文件连接后的统计) 
    FNR 当前记录的个数(仅为当前文件的统计,非全部)
    FS 字段分隔符 默认为连续空格或制表符,可以使用多个不同的符号做分隔符 -F[:/]
    OFS 输出字符的分隔符 默认是空格
    # awk -F: 'OFS="=====" {print $1,$2}' /etc/passwd
    root=====x
    NF 当前读入行的字段个数
    ORS 输出记录分隔符 默认是换行
    # awk -F: 'ORS="=====" {print $1,$2}' /etc/passwd
    root x=====bin x=====
    FILENAME 当前文件名

    引用shell变量的方法

    # a=root
    # awk -v var=$a -F: '$1 == var {print $0}' /etc/passwd
    或者 把整个命令拆开传递,让shell变量外露,
    # awk -F: '$1 == "'$a'" {print $0}' /etc/passwd
    # a=NF
    # awk -F: '{print $'$a'}' /etc/passwd

    三.操作符
    赋值
    = += -= /= *= 
    逻辑与 逻辑或 逻辑非
    && || !
    匹配正则或不匹配,正则需要用 /正则/ 包围住
    ~ !~
    关系 比较字符串时要把字符串用双引号引起来
    < <= > >= != ==
    字段引用
    $ 字段引用需要加$,而变量引用直接用变量名取
    运算符
    + - * / % ++ --
    转义序列
    \ 自身
    $ 转义$
    制表符
     退格符
    回车符
    换行符
    c 取消换行

    四.if (条件) 动作

    若有多个动作,则要用大括号将动作体包含起来 if (条件) {动作1;动作2}
    # awk -F: '{if ($1 == "root") print $1}' /etc/passwd
    root

    # awk -F: '{if ($1 == "root") {print $1;print $6}}' /etc/passwd
    root
    /root
    #

    if (条件1)
    动作1
    else
    动作2
    # awk -F: '{if ($1 == "root"){print $1}else print $6}' /etc/passwd
    # awk -F: '{if ($1 == "root") print $1;else print $6}' /etc/passwd
    上面两个命令是等价的,要么用分号隔开,表示第一个动作体的结束,要么将动作体用大括号定位范围

    if (条件 1)
    动作1
    else if(条件 2)
    动作2
    else if(条件 3)
    动作3
    else
    动作4
    # awk -F: '{if ($1 == "root") print $1;else if ($1 == "seker") print $6;else if ($1 == "zorro") print $7;else print NR}' /etc/passwd
    root
    2
    3
    ...
    33
    /home/seker
    /bin/bash
    36

     

    条件 ? 动作1 : 动作2
    expr?action1:action2
    # awk -F: 'var=($3 >= 500)?$1:"system_user" {print $1" "$3" "var}' /etc/passwd
    # awk -F: '{print ($3>500?$1:$2)}' /etc/passwd

  • 相关阅读:
    Delphi数据库处理
    cxgrid的FINDPANEL编程
    LESS简介
    LESS速查
    $(window).load(function() {})和$(document).ready(function(){})的区别
    CSS中单位px和em,rem的区别
    父元素与子元素之间的margin-top问题
    CSS垂直居中精华总结
    Font Awesome使用指南
    Sublime3安装过程及常用插件安装及常用快捷键
  • 原文地址:https://www.cnblogs.com/asaka/p/6606701.html
Copyright © 2011-2022 走看看