linux命令——awk

作用/语法


强大的文本分析

awk处理过程: 依次对每一行进行处理,然后输出

awk [选项参数] 'script' var=value file(s) 或 awk [选项参数] -f scriptfile var=value file(s)

默认分隔符-按空格或TAB分割

实例说话


用法一:每行按空格或TAB分割

】每行按空格或TAB分割,输出文本中的1、4项

$ awk '{print $1,$4}' log.txt

】格式化输出

$ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt

用法二:指定分割字符

】awk -F #-F相当于内置变量FS, 指定分割字符

1)$ awk -F, '{print $1,$2}' log.txt

2)# 或者使用内建变量 $ awk 'BEGIN{FS=","} {print $1,$2}' log.txt

】使用多个分隔符

$ awk -F '[ ,]' '{print $1,$2,$5}' log.txt

用法三:设置变量

】用法三: awk -v # 设置变量

$ awk -va=1 '{print $1,$1+a}' log.txt

$ awk -va=1 -vb=s '{print $1,$1+a,$1b}' log.txt 

过滤

】过滤第一列大于2的行

$ awk '$1>2' log.txt #命令

】过滤第一列等于2的行

$ awk '$1==2 {print $1,$3}' log.txt #命令 

】过滤第一列大于2并且第二列等于'Are'的行

$ awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt #命令

输入分隔符

】# 输出顺序号 NR, 匹配文本行号 $ awk '{print NR,FNR,$1,$2,$3}' log.txt

】 # 指定输出分割符 $ awk '{print $1,$2,$5}' OFS=" $ " log.txt

使用正则,字符串匹配

】# 输出第二列包含 "th",并打印第二列与第四列  $ awk '$2 ~ /th/ {print $2,$4}' log.txt 

ps: ~ 表示模式开始。// 中是模式。

】# 输出包含"re" 的行 $ awk '/re/ ' log.txt

】忽略大小写

$ awk 'BEGIN{IGNORECASE=1} /this/' log.txt 

模式取反

$ awk '$2 !~ /th/ {print $2,$4}' log.txt

 $ awk '!/th/ {print $2,$4}' log.txt 

参考http://www.runoob.com/linux/linux-comm-awk.html

更多例子轰炸

】第一列  : last -5 | awk '{print $1}'

】 获取第一列并去重 : last -5 | awk '{print $1}' | uniq

】 : 分隔符    :  #cat /etc/passwd |awk -F ':' '{print $1}'

】如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以tab键分割

#cat /etc/passwd |awk -F ':' '{print $1"\t"$7}' root /bin/bash daemon /bin/sh bin /bin/sh sys /bin/sh

】在输出的开头和结尾添加输出

在所有行前添加列名name,shell,在最后一行添加"blue,/bin/nosh"。

cat /etc/passwd |awk  -F ':'  'BEGIN {print "name,shell"}  {print $1","$7} END {print "blue,/bin/nosh"}'

 

 

】搜索含有某关键字的行-(找出含有关键字‘man’的行)

cat '/etc/passwd' | awk -F : '/man/{print $0}' input.txt

 

 

条件判断-把文件text中第二列大于10的行的第一列+“is expensive”输出

cat text | awk -F '\t' '$2 >= 10 {print $1, " is Expensive"}'

 

Banana  0.89

Paech   8.79

Kiwi    11.50

Pineapple   1.29

Apple   10.99

 

结果:

Kiwi is Expensive Apple is Expensive

 

把文件text中第二列大于10的输出“is expensive”,小于9的输出“is cheap”

cat text | awk -F '\t' '$2 >= 10 {print $1, " is Expensive"} $2 <= 9 {print $1 " is cheap"}' Banana is cheap Paech is cheap Kiwi is Expensive Pineapple is cheap Apple is Expensive

打印$4 包含 Brown 的行

awk '$4~/Brown/ {print $0}' grade.txt

#精确匹配

 

awk '$3=="48" {print $0}' grade.txt

P.Bunny         02/99   48      Yellow  12      35      28

不匹配 使用 ‘!~’

zhuyupeng@zhuyupeng-PC ~

$ awk '$0 !~ /Brown/' grade.txt

 

awk '$4 != "Brown-2" {print $0}' grade.txt

 

小于

awk '$6 < $7 {print $0 "$1 Try better at the next comp"}' grade.txt

M.Tansley       05/99   48311   Green   8       40      44$1 Try better at the next comp

J.Lulu          06/99   48317   green   9       24      26$1 Try better at the next comp

打印第8行

➜  testlinux git:(master) ✗ awk 'NR==8{print $0} ' a.txt

555855

➜  testlinux git:(master) ✗ awk 'NR==8 {print $0}' a.txt

555855

 

功能是打印所有输入行

awk '{print $0} ' f ilename

 

打印每行字段数

awk -F: '{print NF,$0} ' f ilename

 

打印字段数大于等于4个的行

Awk -F: ‘NF>=4{print $0} ’ f ilename

 

 

打印UID在 30-40范围内的用户名

Awk -F: '$3>=30&&S3<=40{print $1}' f ilename

 

Awk  '$1>=30000000&&S1<=400000000 {print $1}' a.txt

if/else

打印:第1列*第2列的值大于100的行

 

awk '$1 * $2 >100 {print $1}' file         显示文件中第一个域匹配101的行(记录)

修改某个列后打印

awk '{$1 == 'Chi' {$3 = 'China'; print}' file        找到匹配行后先将第3个域替换后再显示该行(记录)。 

    awk '{$7 %= 3; print $7}'  file           将第7域被3除,并将余数赋给第7域再打印。

给变量赋值后打印

awk '/tom/ {wage=$2+$3; printf wage}' file          找到匹配行后为变量wage赋值并打印该变量。

 END表示在所有输入行处理完后进行处理。

testlinux git:(master) ✗ awk '/123444/ {count++;}  

         END {print "tom was found "count" times"}' a.txt

tom was found 12333 times

 

把file1、file2、file3的文件内容全部写到fileall中,格式为 

    打印文件并前置文件名。

 

 awk '{ print FILENAME,$0 }' a.txt b.txt>fileall.txt 

 

对a.txt文件的第四个域进行求和!

awk 'BEGIN{total=0}{total+=$4}END{print total}' a.txt 

 

开头

  • $ awk '/^(no|so)/' test      -----打印所有以模式no或so开头的行。
  • $ awk '/^[ns]/{print $1}' test       -----如果记录以n或s开头,就打印这个记录。
  • $ awk '$1 ~/[0-9][0-9]$/(print $1}' test         -----如果第一个域以两个数字结束就打印这个记录。
  • $ awk '$1 == 100 || $2 < 50' test      -----如果第一个或等于100或者第二个域小于50,则打印该行。
  • $ awk '$1 != 10' test    -----如果第一个域不等于10就打印该行。
  • $ awk '/test/{print $1 + 10}' test  -----如果记录包含正则表达式test,则第一个域加10并打印出来。

 

打印日志

awk '{print $1,$2,$3}'  error.log

结果:

INFO 2018-12-24 15:50:00

INFO 2018-12-24 15:50:00

INFO 2018-12-24 15:51:00

INFO 2018-12-24 15:51:00

INFO 2018-12-24 15:52:00

INFO 2018-12-24 15:52:00

INFO 2018-12-24 15:53:00

INFO 2018-12-24 15:53:00

INFO 2018-12-24 15:54:00

INFO 2018-12-24 15:54:00

INFO 2018-12-24 15:55:00

INFO 2018-12-24 15:55:00

INFO 2018-12-24 15:56:00

INFO 2018-12-24 15:56:00

INFO 2018-12-24 15:57:00

INFO 2018-12-24 15:57:00

 

error.log

 INFO 2018-12-24 15:56:00 RunBusiness.class 230 Line 任务是否可执行,task_id=115,最终状态=false,status=0,auto_task_rules_id=178 

 INFO 2018-12-24 15:57:00 MyJob.class 56 Line 调度开始了,id=178,uuid=8e5d5ba7-badf-4a73-804d-63b7814c40bd,task_id=115 

 INFO 2018-12-24 15:57:00 RunBusiness.class 230 Line 任务是否可执行,task_id=115,最终状态=false,status=0,auto_task_rules_id=178 

 INFO 2018-12-24 15:58:00 MyJob.class 56 Line 调度开始了,id=178,uuid=8e5d5ba7-badf-4a73-804d-63b7814c40bd,task_id=115 

 INFO 2018-12-24 15:58:00 RunBusiness.class 230 Line 任务是否可执行,task_id=115,最终状态=false,status=0,auto_task_rules_id=178 

 

字符串比较/日期比较

awk '$3>"16:03:00"{print $1,$2,$3}'  error.log

 

 

awk '$3=="16:03:00"{print $1,$2,$3}'  error.log

 

awk 字符拼接

  • cat cpu.txt | awk '{print $1,$2"核"$3"G"}' 
  • i-6gdkkemx 2核2G

 

awk字符串转数字

逻辑:只需要将变量通过”+”连接运算。自动强制将字符串转为整型。非数字变成0,发现第一个非数字字符,后面自动忽略。

 

awk 'BEGIN{a="100";b="10test10";print (a+b+0);}' 

 

awk数字转为字符串

逻辑:只需要将变量与””符号连接起来运算即可。

 

awk 'BEGIN{a=100;b=100;c=(a""b);print c}'      

100100

 

awk字符串连接操作

[chengmo@centos5 ~]$ awk 'BEGIN{a="a";b="b";c=(a""b);print c}'      

ab

[chengmo@centos5 ~]$ awk 'BEGIN{a="a";b="b";c=(a+b);print c}'  

0

字符串连接操作通”二“,”+”号操作符。模式强制将左右2边的值转为 数字类型。然后进行操作。

 

 

更高级用法

 

https://www.cnblogs.com/www1707/p/5447990.html

 

参考

https://www.cnblogs.com/kaituorensheng/p/3919212.html

https://www.cnblogs.com/zhuyp1015/archive/2012/07/14/2591822.html

http://blog.51cto.com/ko178/1734417

https://www.cnblogs.com/emanlee/p/3327576.html

https://www.jb51.net/LINUXjishu/118076.html

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

多则惑少则明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值