awk的基本结构

awk 'BEGIN{} pattern {} END {}'
#pattern {} 部分是针对每行进行循环处理的,有pattern表示对匹配到的行处理,没有pattern表示对所有行处理

[root@test88 etc]# echo -e "line1\nline2" | awk 'BEGIN {print "Start"} {print} END {print "End"}'
Start
line1
line2
End [root@test88 etc]# echo | awk '{var1="v1";var2="v2";var3="v3";print var1,var2,var3;}' // ,表示用空格分割
v1 v2 v3 [root@test88 etc]# echo | awk '{var1="v1";var2="v2";var3="v3";print var1"-"var2"-"var3;}' // "" 用于拼接字符串
v1-v2-v3

awk内置变量

 NR 当前行的记录数,即行号
   NF 当前行的字段数目
   FS 字段分隔符
   $0 整行文本
   $1 第一个字段
   $2 第二个字段
[root@test88 etc]# 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}'
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

可以用$NF表示最后一个字段

[root@test88 etc]# echo -e "line1 f2 f3\nline2 f4 f5\nline3 f6 f7" | awk '{print $NF}' // 可以用$NF表示最后一个字段
f3
f5
f7

可以用NR统计行数

[root@test88 etc]# awk 'END{print NR}' file   //统计行数

使用awk进行简单的累加

[root@test88 etc]# seq 5 | awk 'BEGIN {sum=0;print "Summation:"}{print $1"+";sum+=$1}END{print "==";print sum}'
Summation:
1+
2+
3+
4+
5+
==
15

将外部变量传进awk

[root@test88 etc]# VAR=100000
[root@test88 etc]# echo | awk -v VARIABLE=$VAR '{print VARIABLE}' // 使用外部变量
100000 [root@test88 etc]# var1="Variable1";var2="Variable2"
[root@test88 etc]# echo | awk '{print v1,v2}' v1=$var1 v2=$var2
Variable1 Variable2 [root@test88 etc]# awk '{print v1,v2}' v1=$var1 v2=$var2 filename
[root@test88 ~]# awk '{print v1,v2}' v1=$var1 v2=$var2 /etc/hosts
Variable1 Variable2
Variable1 Variable2
Variable1 Variable2
Variable1 Variable2

匹配指定行进行操作

[root@test88 ~]# cat file.txt
1
2
3
4
5
linux
linux win
win [root@test88 ~]# awk 'NR < 5' file.txt
1
2
3
4 [root@test88 ~]# awk 'NR==1,NR==4' file.txt
1
2
3
4 [root@test88 ~]# awk '/linux/' file.txt
linux
linux win [root@test88 ~]# awk '!/linux/' file.txt
1
2
3
4
5
win

指定匹配分隔符

[root@test88 ~]# awk -F : '{print $NF}' /etc/passwd
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/sync [root@test88 ~]# awk 'BEGIN{FS=":"}{print $NF}' /etc/passwd
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/sync

使用getline获得命令的输出

[root@test88 ~]# echo | awk '{"grep root /etc/passwd"|getline cmdout;print cmdout}'  // getline获得命令输出并赋给cmdout变量,默认读取第一行输出
root:x:0:0:root:/root:/bin/bash

使用for循环

[root@test88 ~]# awk -F: '/root/{for(i=0;i<10;i++) {print $i}}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
root
x
0
0
root
/root
/bin/bash

length(string)返回字符串长度

[root@test88 ~]# echo "linux" | awk '{print length($0)}'
5

index(string,search_string)返回目标字符串的位置

[root@test88 ~]# echo "linux" | awk '{print index($0,"i")}'
2

倒序打印

[root@test88 ~]# seq 9 | awk '{lifo[NR]=$0}END{for(lino=NR;lino>0;lino--){print lifo[lino];}}'  //把内容放入数组,结束后再倒着输出一遍
9
8
7
6
5
4
3
2
1 [root@test88 ~]# seq 9 | tac
9
8
7
6
5
4
3
2
1

提取IP地址

[root@test88 ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:D2:82:D9
inet addr:10.0.0.88 Bcast:10.0.0.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fed2:82d9/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:20531 errors:0 dropped:0 overruns:0 frame:0
TX packets:12613 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:26297973 (25.0 MiB) TX bytes:768281 (750.2 KiB)
[root@test88 ~]# ifconfig | awk -F "[ :]+" 'NR==2{print $4}'
10.0.0.88

awk脚本

关于awk脚本,我们需要注意两个关键词BEGIN和END。

  • BEGIN{ 这里面放的是执行前的语句 }
  • END {这里面放的是处理完所有的行后要执行的语句 }
  • {这里面放的是处理每一行时要执行的语句}

假设有这么一个文件(学生成绩表):

$ cat score.txt
Marry 2143 78 84 77
Jack 2321 66 78 45
Tom 2122 48 77 71
Mike 2537 87 97 95
Bob 2415 40 57 62

我们的awk脚本如下:

$ cat cal.awk
#!/bin/awk -f
#运行前
BEGIN {
math = 0
english = 0
computer = 0 printf "NAME NO. MATH ENGLISH COMPUTER TOTAL\n"
printf "---------------------------------------------\n"
}
#运行中
{
math+=$3
english+=$4
computer+=$5
printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5
}
#运行后
END {
printf "---------------------------------------------\n"
printf " TOTAL:%10d %8d %8d \n", math, english, computer
printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR
}

我们来看一下执行结果

$ awk -f cal.awk score.txt
NAME NO. MATH ENGLISH COMPUTER TOTAL
---------------------------------------------
Marry 2143 78 84 77 239
Jack 2321 66 78 45 189
Tom 2122 48 77 71 196
Mike 2537 87 97 95 279
Bob 2415 40 57 62 159
---------------------------------------------
TOTAL: 319 393 350
AVERAGE: 63.80 78.60 70.00

计算文件大小

[root@C ~]# ls -l *.txt | awk '{sum+=$5}END{print sum}'
420

筛选文本长度

#打印长度大于4的文本行
[root@C ~]# awk 'length>4' test.txt
liyong
oldboy

awk常见操作整理(更新)的更多相关文章

  1. shell常见操作整理(更新)

    查看文件第20到30行的内容 法一:[root@oldboy ~]# seq 100 > ett.txt [root@oldboy ~]# head -30 ett.txt | tail -11 ...

  2. grep常见操作整理(更新)

    提取邮箱和URL [root@test88 ~]# cat url_email.txt root@gmail.com,http://blog.peter.com,peter@qq.com [root@ ...

  3. JS 数组常见操作汇总,数组去重、降维、排序、多数组合并实现思路整理

    壹 ❀ 引 JavaScript开发中数组加工极为常见,其次在面试中被问及的概率也特别高,一直想整理一篇关于数组常见操作的文章,本文也算了却心愿了. 说在前面,文中的实现并非最佳,实现虽然有很多种,但 ...

  4. SQL不同服务器数据库之间的数据操作整理(完整版)

    ---------------------------------------------------------------------------------- -- Author : htl25 ...

  5. C#路径/文件/目录/I/O常见操作汇总

    文件操作是程序中非常基础和重要的内容,而路径.文件.目录以及I/O都是在进行文件操作时的常见主题,这里想把这些常见的问题作个总结,对于每个问题,尽量提供一些解决方案,即使没有你想要的答案,也希望能提供 ...

  6. X-Cart 学习笔记(四)常见操作

    目录 X-Cart 学习笔记(一)了解和安装X-Cart X-Cart 学习笔记(二)X-Cart框架1 X-Cart 学习笔记(三)X-Cart框架2 X-Cart 学习笔记(四)常见操作 五.常见 ...

  7. C#路径/文件/目录/I/O常见操作汇总<转载>

    文件操作是程序中非常基础和重要的内容,而路径.文件.目录以及I/O都是在进行文件操作时的常见主题,这里想把这些常见的问题作个总结,对于每个问题,尽量提供一些解决方案,即使没有你想要的答案,也希望能提供 ...

  8. 【转】C#路径/文件/目录/I/O常见操作汇总

    文件操作是程序中非常基础和重要的内容,而路径.文件.目录以及I/O都是在进行文件操作时的常见主题,这里想把这些常见的问题作个总结,对于每个问题,尽量提供一些解决方案,即使没有你想要的答案,也希望能提供 ...

  9. 转载-SQL不同服务器数据库之间的数据操作整理(完整版) .

    ---------------------------------------------------------------------------------- -- Author : htl25 ...

随机推荐

  1. [洛谷P2161][SHOI2009]会场预约

    题目大意:有两种操作: $A\;l\;r:$表示加入区间$[l,r]$,并把与之冲突的区间删除,输出删除的区间的个数,区间$A$于区间$B$冲突当且仅当$A\cap B\not=\varnothing ...

  2. 【周记:距gdoi43天】

    这个星期切了几道题吧,虽然说还是想让自己搏一搏,但是毕竟自己弱嘛,而且很多东西都还没熟透&不像rausen大神都屠进前100了. 加油吧.

  3. 【BZOJ4894】天赋(矩阵树定理)

    [BZOJ4894]天赋(矩阵树定理) 题面 BZOJ Description 小明有许多潜在的天赋,他希望学习这些天赋来变得更强.正如许多游戏中一样,小明也有n种潜在的天赋,但有 一些天赋必须是要有 ...

  4. thread-wait/sleep

    对于sleep()方法,我们首先要知道该方法是属于Thread类中的.而wait()方法,则是属于Object类中的. sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监 ...

  5. 解决jsp两种提交方式乱码 的方法

    解决中文乱码 ---post提交方式  需要在处理页面添加request.setCharacterEncoding("utf-8"); 制定请求的编码,调用一下request.ge ...

  6. NOIP系列(续)

    马上就要告别noip了呢. 这道题大家都说dfs可过. 但是数据范围一眼状压啊. 首先假设点是有序的(选取有先后顺序),其实这并不影响什么,但是却省下大量的时间和代码长度. 然后状压,dp[i]表示状 ...

  7. [LOJ 6159] 最长树链

    看到要求gcd不为1所以肯定在这条答案链上都是一个质数的倍数,所以就会产生一个很暴力的想法 没错,正解就是这样的暴力 只让走是i(素数)倍数的点,作最长链 最长链可以树形dp或两遍bfs,一遍找端点, ...

  8. 如何使用impdp导入oracle数据库文件

    1.首先,安装好oracle数据库. 2.使用sqlplus进入sysdba权限,sqlplus "/as sysdba", 例如: 3.创建用户framework,例如: CRE ...

  9. All you need to know about sorting in Postgres

    按:之前看pg的执行计划,多次看到不同的排序方式,但不知何意.偶遇此篇讲解pg执行计划三种排序方式,备忘一下. Sorting Sorting is one of the most fundament ...

  10. EF数据更新时候异常情况一

    在不熟练EF的时候有时更新数据时候会报以下异常: 错误原因:此时操作的实体不是从数据库里获取的.而是自己new出来的实体然后赋值的.EF此时的存储池中已经有了这个实体,在new一个对象ID相同就不能共 ...