awk

awk是用来处理文本的。

  • 和sed的区别:
    sed就像一个女人化妆,只能修饰。
    awk是整容术,会对文本进行比较大的改动。

命令的结构

案例一,结构:

  • { } 类似一个循环体,会对文件中的每一行进行迭代。
    1
    2
    3
    4
    5
    - BEGIN{}

    - {}

    - END{}
    上面三个语句都有一个花括号,其中放置的是命令(就是要对文本的操作)
    而begin、end这些符号,指的是,何时执行命令。
    比如,begin指的是,先执行命令,再读取一行文本。
    {}指的是,对于读取的文本,执行这个命令。
    end 在文本读取完毕之后执行。

案例二,awk的标识符:

echo -e “line1 f2 f3\nline2 f4 f5\nline3 f6 f7”
Result:
line1 f2 f3
line2 f4 f5
line3 f6 f7

echo -e “line1 f2 f3\nline2 f4 f5\nline3 f6 f7” | awk ‘{ print “Line no:”NR“,No of fields:”NF, “$0=”$0, “$1=”$1,”$2=”$2,”$3=”$3}’
Result:
Line no:1,No of fields:3 $0=line1 f2 f3 $1=line1 $2=f2 $3=f3
Line no:2,No of fields:3 $0=line2 f4 f5 $1=line2 $2=f4 $3=f5
Line no:3,No of fields:3 $0=line3 f6 f7 $1=line3 $2=f6 $3=f7

  • NR : 记录数量(1,2,3,4)
    比如说,awk 'END{ print NR }' xx.txt 输出xx.txt的行数。

  • NF : 字段数量

  • $1 $2 $3, awk默认以空格作为字段的分隔符。
    就是说一段文本,A B C 代表了第一个字段,第二个字段以及第三个字段。
    $0代表了A B C 本身。

awk 'NR<=1 { print $1 }' 1.txt
获取该文件第一行的第一个字段

案例三,以行分割文本:

同理可得:awk '/步骤1/,/步骤2/' *.md
这个命令可以将文档分割,得到步骤一。

案例四,以纵排分割文本:

awk选择特定字符进行分割。如果不选择,默认空格作为分隔符。
awk -F ':' '{print $1}' fileA