Linux awk 命令


linux中最为常用的三大文本(grep,sed,awk)处理工具

Linux sed 命令
https://blog.csdn.net/lqy971966/article/details/107006904
Linux grep 命令
https://blog.csdn.net/lqy971966/article/details/106927370
Linux awk 命令
https://blog.csdn.net/lqy971966/article/details/107019195

1. 定义

  1. awk 其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上 AWK 的确拥有自己的语言:AWK 程序设计语言,三位创建者已将它正式定义为“样式扫描和处理语言”。

  2. awk 也是常用的文本处理工具之一。
    对文本每一行进行指定规则处理并输出。

1.1 man awk //man 的解释

mawk - pattern scanning and text processing language
模式扫描与文本处理语言

1.2 功能

awk 对文件的每一行进行指定规则的处理(查看)或者信息提取。

1.2.1 特点

  1. awk是行处理器
  2. 依次对每一行进行处理,然后输出
  3. 将一行分成数个字段来处理

作为linux中最为常用的三大文本(awk,sed,grep)处理工具之一
awk 是三剑客的老大

1.3 awk 工作原理

与sed一样, 均是一行一行的读取、处理
sed 作用于一整行的处理,
而 awk 将一行分成数个字段来处理

1.3.1 优点

在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息

1.4 语法

awk [选项] ‘[条件]{编辑指令}’ filename
如:awk -F 分隔符 ‘/模式/{动作}’ 输入文件

1.4.1 常用命令选项

  1. -F:指定分隔符,可省略(默认空格或者Tab位)
    -F fs or --field-separator fs
    指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。
    -F相当于内置变量FS, 指定分割字符

    注意 这里分隔符以下三种情况均可正常使用
    awk -F “:” = awk -F: = awk -F :

  2. -f:调用awk脚本尽心个处理
    -f scripfile or --file scriptfile
    从脚本文件中读取awk命令。

  3. -V:调用外部shell变量
    -v var=value or --asign var=value
    赋值一个用户定义变量。

1.4.2 内置变量

变量       用途
FS        保存或设置字段分隔符,如FS=":"
$n        指定分隔的第n个字段,例如$1,$4分别表示第1个字段,第4个字段
$0        当前读入的整行文本内容
NF        记录当前处理行的字段个数(有多少列)
FNR       记录当前处理行在原文本内的行号
NR        记录当前已经读入行的数量(多少行)
FILENAME   当前处理的文件名
ENVIRON    调用shell环境变量,格式:ENVIRON[“变量名”]

1.4.3 语法规则-单引号,花括号,分号

awk -F 分隔符 ‘/模式/{动作}’ 输入文件
指令=模式+动作 即: ‘/模式/{动作}’

awk的指令一定要用单引号括起
awk的动作一定要用花括号括起
模式可以是正则表达式、条件表达式或两种组合
如果模式是正则表达式要用/定界符
多个动作之间用;号分开

1.4.4 BEGIN 和 END

  1. BEGIN
    在许多编程情况中,可能需要在 awk 开始处理输入文件中的文本之前执行初始化代码。
    对于这种情况, awk 允许您定义一个 BEGIN 块。
    它是初始化 FS(字段分隔符)变量、打印页眉或初始化其它在程序中以后会引用的全局变量的极佳位置。

  2. END
    awk 还提供了另一个特殊块,叫作 END 块。
    awk 在处理了输入文件中的所有行之后执行这个块。
    通常, END 块用于执行最终计算或打印应该出现在输出流结尾的摘要信息。

2. 例子及说明

以下所有的例子都是以下下面的test 进行测试说明

root@ubuntu/home/awkTest# cat test 

hello:world:hello:hani
hello:world:hello:hani
hani:is:a:good:man:hani:is:handsome
this:is:the:test:script:of:awk:test
linux:awk:test
123456789
/aaa/bbb/ccc/ddd/eee/fff
I name is hani, i am a engineer.

2.1 awk -F":" ‘{ print $1 }’ test //打印第一个字段

-F:指定分隔符
$n 指定分隔的第n个字段

root@ubuntu/home/awkTest# awk -F":" '{ print $1 }' test 
hello
hello
hani
this
linux
123456789
/aaa/bbb/ccc/ddd/eee/fff
I name is hani, i am a engineer.

2.2 awk ‘{if(NR>=1 && NR<=4) print $0}’ test //打印符合条件的整行

NR 记录当前已经读入行的数量
$0 当前读入的整行文本内容

root@ubuntu/home/awkTest# awk '{if(NR>=1 && NR<=4) print $0}' test 
hello:world:hello:hani
hello:world:hello:hani
hani:is:a:good:man:hani:is:handsome
this:is:the:test:script:of:awk:test

2.3 awk -F ‘[ ,]+’ ‘{print $4" "$8}’ test //打印指定字段

一个或多个空格或逗号分隔开

root@ubuntu/home/awkTest# awk -F '[ ,]+' '{print $4" "$8}' test 
……空行
hani engineer.

2.4 awk 'BEGIN {count=0;print "[start] line count is ",count} \

{count=count+1;print $0} \
END{print "[end] line count is ",count}' test


root@ubuntu/home/awkTest# awk 'BEGIN {count=0;print "[start] line count is ",count} \
{count=count+1;print $0} \
END{print "[end] line count is ",count}' test
[start] line count is  0
hello:world:hello:hani
hello:world:hello:hani
hani:is:a:good:man:hani:is:handsome
this:is:the:test:script:of:awk:test
linux:awk:test
123456789
/aaa/bbb/ccc/ddd/eee/fff
I name is hani, i am a engineer.
[end] line count is  8

count是自定义变量。之前的action{}里都是只有一个print,其实print只是一个语句,
而 action{}可以有多个语句,以;号隔开。
一共8行

2.5 awk ‘BEGIN{a=1;b=2;print (a>2&&b>1,a=1||b>1)}’

关系运算符+逻辑运算符

root@ubuntu/home/awkTest# awk 'BEGIN{a=1;b=2;print (a>2&&b>1,a=1||b>1)}'
0 1

2.6 awk ‘BEGIN{a=11;if(a>=9){print “ok”}}’

关系运算符

root@ubuntu/home/awkTest# awk 'BEGIN{a=11;if(a>=9){print "ok"}}' 
ok

2.7 awk -F “:” ‘NF==8{print $0}’ test

NF 记录当前处理行的字段个数(有多少列)

root@ubuntu/home/awkTest# awk -F ":" 'NF==8{print $0}' test 
hani:is:a:good:man:hani:is:handsome
this:is:the:test:script:of:awk:test

2.8 awk -F: ‘$3>=500 && $3<=60000{print $0}’ /etc/passwd

root@ubuntu/home/awkTest# awk -F: '$3>=500 && $3<=60000{print $0}' /etc/passwd
dlp:x:1000:1000:ubuntu dlp/a1,,,:/home/dlp:/bin/bash

2.9 awk ‘{print NF}’ test

root@ubuntu/home/awkTest# awk '{print NF}' test 
1
1
1
1
1
1
1
8

待续……

awk太多 后面再添加

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值