• Linux常用基本命令:三剑客命令之-awk内置变量与自定义变量


    AWK中,变量分为两种:内置变量与自定义变量。

    常见的内置变量有:

    FS:输入字段分隔符, 默认为空白字符

    OFS:输出字段分隔符, 默认为空白字符

    RS:输入记录分隔符(输入换行符), 指定输入时的换行符

    ORS:输出记录分隔符(输出换行符),输出时用指定符号代替换行符

    NF:number of Field,当前行的字段的个数(即当前行被分割成了几列),字段数量

    NR:行号,当前处理的文本行的行号。

    FNR:各文件分别计数的行号

    FILENAME:当前文件名

    ARGC:命令行参数的个数

    ARGV:数组,保存的是命令行所给定的各参数

    下面的NF 打印出每行有多少列: 

    ghostwu@dev:~/linux/awk$ awk '{print NF}' ghostwu.txt 
    1
    2
    3
    ghostwu@dev:~/linux/awk$ cat ghostwu.txt 
    ghostwu
    zhangsan 22
    lisi 23 woman

    引用NF变量,需要用美元符号

    ghostwu@dev:~/linux/awk$ cat ghostwu.txt 
    ghostwu 20 man
    zhangsan 22 woman
    lisi 23 woman
    ghostwu@dev:~/linux/awk$ awk '{print $NF}' ghostwu.txt 
    man
    woman
    woman
    ghostwu@dev:~/linux/awk$ awk '{print $(NF-2), $(NF-1), $(NF)}' ghostwu.txt 
    ghostwu 20 man
    zhangsan 22 woman
    lisi 23 woman

    NR:每一行的行号:

    ghostwu@dev:~/linux/awk$ awk '{print NR,$0}' ghostwu.txt 
    1 ghostwu 20 man
    2 zhangsan 22 woman
    3 lisi 23 woman

    1,awk支持多文件扫描,如果采用NR, 下一个文件的行序号会接着上一个文件,FNR就会单独统计

    ghostwu@dev:~/linux/awk$ awk '{print NR, $0}' ghostwu.txt ghostwu.bak 
    1 ghostwu 20 man
    2 zhangsan 22 woman
    3 lisi 23 woman
    4 ghostwu 20 man
    5 zhangsan 22 woman
    6 lisi 23 woman
    ghostwu@dev:~/linux/awk$ awk '{print FNR, $0}' ghostwu.txt ghostwu.bak 
    1 ghostwu 20 man
    2 zhangsan 22 woman
    3 lisi 23 woman
    1 ghostwu 20 man
    2 zhangsan 22 woman
    3 lisi 23 woman

    2,RS指定行输入符,默认为回车换行,如果我们想让他以空格作为行输入符( 即,遇到空格就换行 ),当我们指定使用空格作为"行分隔符"时,在awk解析文本时,每当遇到空格,awk就认为遇到的空格是换行符,于是awk就将文本换行了

    ghostwu@dev:~/linux/awk$ awk '{print NR, $0}' ghostwu.txt 
    1 ghostwu 20 man
    2 zhangsan 22 woman
    3 lisi 23 woman
    ghostwu@dev:~/linux/awk$ awk -v RS=" " '{print NR, $0}' ghostwu.txt
    1 ghostwu
    2 20
    3 man
    zhangsan
    4 22
    5 woman
    lisi
    6 23
    7 woman

    3,ORS指定输出行分隔符

    ghostwu@dev:~/linux/awk$ awk -v ORS='---->' '{print $0}' ghostwu.txt 
    ghostwu 20 man---->zhangsan 22 woman---->lisi 23 woman---->ghostwu@dev:~/linux/awk$ 

    4,可以同时指定,输入,输出行分隔符

    ghostwu@dev:~/linux/awk$ awk -v RS=" " -v ORS='->' '{print $0}' ghostwu.txt
    ghostwu->20->man
    zhangsan->22->woman
    lisi->23->woman

    5,FILENAME:文件名称

    ghostwu@dev:~/linux/awk$ awk '{print FILENAME, NR, $0}' ghostwu.txt ghostwu.bak
    ghostwu.txt 1 ghostwu 20 man
    ghostwu.txt 2 zhangsan 22 woman
    ghostwu.txt 3 lisi 23 woman
    ghostwu.bak 4 ghostwu 20 man
    ghostwu.bak 5 zhangsan 22 woman
    ghostwu.bak 6 lisi 23 woman

    6,ARGV保存命令行参数的数组,'pattern{action}'并不被看做参数

    ghostwu@dev:~/linux/awk$ awk '{print ARGV[0], ARGV[1], ARGV[2]}' ghostwu.txt 
    awk ghostwu.txt 
    awk ghostwu.txt 
    awk ghostwu.txt 

    7,ARGC:命令行参数的个数,下例:ARGV[1]没有值,因为命令行没有给第三个参数

    ghostwu@dev:~/linux/awk$ awk '{print ARGV[0], ARGV[1], ARGV[2], ARGC}' ghostwu.txt 
    awk ghostwu.txt  2
    awk ghostwu.txt  2
    awk ghostwu.txt  2

     自定义变量:用户自己定义的变量,有两种形式

    1,-v varname=value  变量名区分字符大小写

    ghostwu@dev:~/linux/awk$ awk -v my_name="ghostwu" 'BEGIN{print my_name}'
    ghostwu

    2,在program中直接定义,以下定义了3个自定义变量,其实形式像编程语言一样,定义的时候用分号。打印变量跟之前一样,用逗号隔开,注意,不需要用美元符号.

    ghostwu@dev:~/linux/awk$ awk 'BEGIN{ my_name="ghost"; my_age=22; my_sex="男"; print my_name, my_age, my_sex}'
    ghost 22

    3,也可以引用命令行定义的变量

    ghostwu@dev:~/linux/awk$ echo $myvar
    
    ghostwu@dev:~/linux/awk$ myvar="我在命令行定义的变量"
    ghostwu@dev:~/linux/awk$ awk -v var1=$myvar 'BEGIN{print var1}'
    我在命令行定义的变量
  • 相关阅读:
    python之路_爬虫之selenium模块
    python之路_爬虫之requests模块补充
    扩展中国剩余定理讲解
    扩展中国剩余定理讲解
    bzoj3225 [Sdoi2008]立方体覆盖——扫描线
    差分约束讲解
    CF917C Pollywog —— 状压DP + 矩乘优化
    斜率优化讲解
    AC自动机讲解
    BZOJ2870—最长道路tree
  • 原文地址:https://www.cnblogs.com/ghostwu/p/9085653.html
Copyright © 2020-2023  润新知