目录


  1. awk行处理方式
  2. awk命令格式
    1. 命令行格式
    2. 脚本格式
  3. 命令行格式——基本格式
  4. awk内置变量
  5. awk内置函数
  6. 测试数据
  7. awk变量和函数使用实例
  8. 逻辑判断式
  9. 扩展格式
  10. BEGIN 和 END

awk行处理方式

  awk和sed一样,一次处理一行内容;也可以对每行进行切片处理

awk命令格式

  命令行格式

$  awk [options] 'command' files

  

  脚本格式

$ awk -f scirpt_file files

  

基本格式

$ awk [options] 'command' files

  command 由两部分组成,分别是

  1、pattern,可以是正则表达式或者逻辑判断式

  2、{ awk 命令 }    花括号括起来的是代码段

awk内置变量

变量 含义
$0 当前记录(整行的记录)
$1~$n 当前记录的第几列
FILENAME 输入的文件名称
FS 输入文件的字段分隔符(Fields Separator)
RS 输入文件的记录(每一行之间)的分隔符(Record Separator)
NF 当前行的字段数目(Number of Fields)
NR 当前记录所在的行号
OFS 输出字段的分隔符
ORS 输出记录的分隔符

awk函数

函数声明 含义
length(str) 返回str中字符的个数
int(num) 返回num的整数部分
index(str1, str2) 返回str2在str1中的索引,如果不存在就返回0
split(str, arr, separator) 使用separator作为分隔符,将str切分为数组保存到arr中,返回数组的元素个数
printf(fmt, args) 根据fmt格式化args,并输出结果
sprintf(fmt, args) 根据fmp格式化args,并返回格式化后的字符串
substr(str, pos, len) 返回str中从pos开始,长度为len个字符的子字符串
tolower(str) 返回str转换为小写字母后的副本
toupper(str) 返回str转换为大写字母后的副本

 

测试数据

-> # cat data.txt
小红 female 一年级 BeiJing 90 Yes
小花 female 一年级 ShangHai 55
小明 male 三年级 BeiJing 90
小可 female 一年级 ChongQing 70
小林 male 一年级 ChongQing 90 Yes
小飞 male 二年级 GuangDong 65
小波 male 一年级 HangZhou 90 No
小康 male 四年级 ShenZhen 65 No
小雷 male 一年级 FuJian 70
小冰 female 五年级 BeiJing 90

  

测试awk变量和函数

  打印每一行的行号、字段数、以及每一行的内容

-> # awk '{print "row:" NR "\t" "fields:" NF "\t" $0}' data.txt
row:1 fields:6 小红 female 一年级 BeiJing 90 Yes
row:2 fields:5 小花 female 一年级 ShangHai 55
row:3 fields:5 小明 male 三年级 BeiJing 90
row:4 fields:5 小可 female 一年级 ChongQing 70
row:5 fields:6 小林 male 一年级 ChongQing 90 Yes
row:6 fields:5 小飞 male 二年级 GuangDong 65
row:7 fields:6 小波 male 一年级 HangZhou 90 No
row:8 fields:6 小康 male 四年级 ShenZhen 65 No
row:9 fields:5 小雷 male 一年级 FuJian 70
row:10 fields:5 小冰 female 五年级 BeiJing 90

  

  打印所有的人名、城市

-> # awk '{print $1 "\t" $4}' data.txt
小红 BeiJing
小花 ShangHai
小明 BeiJing
小可 ChongQing
小林 ChongQing
小飞 GuangDong
小波 HangZhou
小康 ShenZhen
小雷 FuJian
小冰 BeiJing

  

  使用printf来格式化打印用户信息

-> # awk -F ':' '{printf("Line:%s   Fields:%s   User:%s\n", NR, NF, $1)}' /etc/passwd
Line:1 Fields:7 User:root
Line:2 Fields:7 User:bin
Line:3 Fields:7 User:daemon
Line:4 Fields:7 User:adm
Line:5 Fields:7 User:lp
Line:6 Fields:7 User:sync
Line:7 Fields:7 User:shutdown

  

  打印用户id大于100的行号和用户名,其他用户不打印,输出hello

-> # awk -F ':' '{
> if ($3 > 100) {
> printf("Line:%s Fields:%s User:%s UID:%s\n", NR, NF, $1, $3)
> } else {
> print "hello"
> }
> }' /etc/passwd

  

  找出服务器访问日志中,出现Error的时间

-> # sed -n '/Error/ p' access_log | awk '{print $1}'
-> # awk '/Error/ {print $1}' access_log

  

  

逻辑判断式

  注意,逻辑判断式是在{ awk命令 }前面的

  ~,!~     是否匹配正则表达式,后面跟一个正则表达式

-> # #查询主机中,用户名包含'g'的用户,打印出用户名和UID
-> # awk -F ':' '$1 ~ /g/ {print "User:"$1 "\t" "UID:"$3}' /etc/passwd
User:games UID:12
User:libstoragemgmt UID:998
User:syslog UID:996
User:yingjie UID:1005 -> # #查询主机中,用户名不包含'g'的用户,打印出用户名和UID
-> # awk -F ':' '$1 !~ /g/ {print "User:"$1 "\t" "UID:"$3}' /etc/passwd

  

  ==,!= , >=,<=,<,> ,||,&&   用于判断大小、是否相等、逻辑关系

-> # #打印分数高于70,或者低于或者等于60的记录
-> # awk '$5 > 70 || $5 < 60 {print $0}' data.txt
小红 female 一年级 BeiJing 90 Yes
小花 female 一年级 ShangHai 55
小明 male 三年级 BeiJing 90
小林 male 一年级 ChongQing 90 Yes
小波 male 一年级 HangZhou 90 No
小冰 female 五年级 BeiJing 90

  

  

扩展格式

$ awk [options]  'command' file

  扩展格式是指,command扩展,格式如下:

  BEGIN { command1 } pattern { awk命令 } END { command2 }

  其中 BEGIN中的command1,会在读入第一行之前执行,并且只执行一次。接着循环执行中间的awk命令、

  然后END后面的command2,会在文件所有行都读完之后,并执行一次command2。

-> # awk 'BEGIN {print "start"} /female/ {print $0} END {print "end"}' data.txt
start
小红 female 一年级 BeiJing 90 Yes
小花 female 一年级 ShangHai 55
小可 female 一年级 ChongQing 70
小冰 female 五年级 BeiJing 90
end

BEGIN和END

  一般在BEGIN中可以做一下事情:

  1、定义分隔符

  2、定义表头  

  自定义分割符、输出时使用的分隔符

  FS (fields separator)

  OFS( output fields separator)

-> # awk 'BEGIN{FS=" ";OFS="-"}{print $2,$1}' data.txt
female-小红
female-小花
male-小明
female-小可
male-小林
male-小飞
male-小波
male-小康
male-小雷
female-小冰

    

  定义表头

-> #  awk '
> BEGIN {print "Name" "\t" "Gender" "\t" "Grade" "\t" "Addr" "\t" "Score" "\t" "VIP"}
> NF == 6 {print $0}
> END {print "----------end-----------"}' data.txt
Name Gender Grade Addr Score VIP
小红 female 一年级 BeiJing 90 Yes
小林 male 一年级 ChongQing 90 Yes
小波 male 一年级 HangZhou 90 No
小康 male 四年级 ShenZhen 65 No
----------end-----------

  

  

  统计当前文件夹下,文件总大小

[root@VM_0_8_centos test]# ls -l
total 8
-rw-r--r-- 1 root root 367 Sep 16 11:51 data.txt
-rw-r--r-- 1 root root 1803 Aug 17 00:14 test.cpp
[root@VM_0_8_centos test]# ls -l | awk 'BEGIN {size=0} {size+=$5} END {print "Size is " size}'
Size is 2170

  

  统计文件中非空行的行数

[root@VM_0_8_centos test]# cat demo.txt
11111 22222 33333
44444
[root@VM_0_8_centos test]# awk 'BEGIN {count=0} $0 !~ /^$/ {count += 1} END {print "Not empty line count " count}' demo.txt
Not empty line count 4

  

  统计女生的数量

-> # awk '
> BEGIN {count = 0}
> {
> if ($2 == "female") {
> name[count++] = $1
> }
> }
> END {
> print "tot " count
> for (i = 0; i < count; i++) {
> print name[i]
> }
> }' data.txt
tot 4
小红
小花
小可
小冰

  

Linux awk使用方法~~整理的更多相关文章

  1. klia linux tools 使用方法整理

    第一部分  信息收集工具 1.Zenmap 和nmap 作用是一样的,只是使用的操作方式不一样, Zenmap使用 的GUI,nmap 是基于命令行的.在两个使用的命令是一样的. 使用SYN扫描  就 ...

  2. Linux awk命令常见使用方法介绍

    Linux awk命令常见使用方法介绍 By:授客 QQ:1033553122   awk运行方式有三种,其中常用的为命令行方式 awk [-F  field_separator]  '{patter ...

  3. linux 常用命令--------雪松整理

    linux 常用命令--------雪松整理 博客: http://hi.baidu.com/quanzhou722/blog错误在所难免,还望指正!========================= ...

  4. linux awk命令详解

    linux awk命令详解 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分 ...

  5. Kali Linux渗透基础知识整理(四):维持访问

    Kali Linux渗透基础知识整理系列文章回顾 维持访问 在获得了目标系统的访问权之后,攻击者需要进一步维持这一访问权限.使用木马程序.后门程序和rootkit来达到这一目的.维持访问是一种艺术形式 ...

  6. Kali Linux渗透基础知识整理(二)漏洞扫描

    Kali Linux渗透基础知识整理系列文章回顾 漏洞扫描 网络流量 Nmap Hping3 Nessus whatweb DirBuster joomscan WPScan 网络流量 网络流量就是网 ...

  7. Linux进程管理知识整理

    Linux进程管理知识整理 1.进程有哪些状态?什么是进程的可中断等待状态?进程退出后为什么要等待调度器删除其task_struct结构?进程的退出状态有哪些? TASK_RUNNING(可运行状态) ...

  8. linux awk浅析(转)

    Awk 是一种非常好的语言,同时有一个非常奇怪的名称.在本系列(共三篇文章)的第一篇文章中,Daniel Robbins 将使您迅速掌握 awk 编程技巧.随着本系列的进展,将讨论更高级的主题,最后将 ...

  9. linux 服务器常用命令整理

    linux 服务器常用命令整理 目录 网络分析 - tcpdump \ telnet \ (netstat \ ss \ lsof) \ nload 网络传输 - scp \ rsync \ (rz ...

随机推荐

  1. Microsoft SQL Server sa 账户 登录错误18456

    分析:在安装Sql server 2012的时候,服务器身份验证没有选择“SQL Server 和 Windows身份验证模式(S)”,导致SQL Server身份验证方式被禁用. 操作: 以Wind ...

  2. FastCGI Error Number: 5 (0x80070005).

    在访问网站的时候,出现了以上这个错误: 在网上搜了很多方法,归纳起来就如下几种: 1, 网站安全狗]的安全策略问题 解决方案: 主动防御/禁止IIS执行程序 添加"php\php-cgi.e ...

  3. CentOS 7 上安装vim(默认未安装)

    今天使用CentOS 7,发现未安装vim,所以重新安装 执行命令: yum -y install vim* 然后就可以使用了

  4. Python单元测试框架 unittest详解

    一 整体结构概览 unittest原名为PyUnit,是由java的JUnit衍生而来.对于单元测试,需要设置预先条件,对比预期结果和实际结果. TestCase :通过继承TestCase类,我们可 ...

  5. 【css】怎么让Chrome支持小于12px 的文字

    谷歌浏览器Chrome是Webkit的内核,有一个 -webkit-text-size-adjust 的私有 CSS 属性,通过它即可实现字体大小不随终端设备或浏览器影响.CSS样式定义如下:-web ...

  6. Linux 创建静态库(.a)和动态库(.so)

    0. 回顾一下 gcc 选项 ============================================== -E : 仅做预处理,例如去注释,宏展开,include 展开等 -S : ...

  7. svn离线安装以及配置,管理python自动化脚本

    1.使用源码安装,自己make和install,难度还挺大的,改用对应iso中的rpm安装包来安装 2.iso中的rpm包安装,会存在rpm包之间的依赖的关系 3.这种依赖关系,可以处理,仍然在iso ...

  8. TypeError: "x" is not a function

    https://stackoverflow.com/questions/32751209/jasmine-typeerror-is-not-a-function 信息 TypeError: " ...

  9. 从code review到Git commit log

    最近在读一本技术类的书:朱赟——<跃迁:从技术到管理的硅谷路径>,其中聊了很多很有趣的观点,比如:技术管理.技术实践.硅谷文化.个人成长等. 读到关于硅谷人如何做code review这一 ...

  10. span<T>之高性能字符串操作实测

    .net中的字符串操作性能问题由来已久,幸运的是微软推出了span<T>高性能指针操作封装工具类.这个类到底有多高的性能呢?网上传言反正很高,但是实际上在网上很难找到合适的测试实例,这让本 ...