gawk - pattern scanning and processing language

基本用法: gawk [options] 'program' FILE...

program: PATTERN{ACTION STATEMENTS},语句之间用分号分隔

    选项:
-F: 指明输入时用到的字段分隔符
# awk -F: 'print $1' /etc/passwd 指明输入时的分隔符为冒号,打印第一个字段
-v var=value: 自定义变量
# awk -v FS=':' '{print $1}' /etc/passwd 使用内建变量FS指明输入时的分隔符为冒号,打印第一个字段
1. print
print item1, item2, ...
要点:
1. 逗号分隔符
2. 输出的各item可以是字符串,也可是数值;当前记录的字段、变量或者awk的表达式
3. 如果省略item,相当于print $0 2. 变量
2.1 内建变量
FS: input field seperator,输入时的分隔符,默认为空白字符
# awk -v FS=':' '{print $1}' /etc/passwd
OFS:output field seperator,输出时的分隔符,默认为空白字符
# awk -v OFS=':' '{print $1,$2,$3,$7}' /etc/passwd
RS: input record seperator,输入时的换行符
# awk -v RS=' ' '{print}' /etc/passwd
ORS: output record seperator,输出时的换行符
# awk -v ORS='#' '{print}' /etc/passwd
NF: number of field,字段数量
# awk '{print NF}' /etc/fstab 显示每行多少段
# awk '{print $NF}' /etc/fstab 显示最后一段的值
NR: number of record,行数
# awk '{print NR}' /etc/fstab 显示每行行数
FNR: 各文件分别计数:行数
# awk '{print FNR}' /etc/fstab /etc/passwd
FILENAME:当前文件名
# awk '{print FILENAME}' /etc/fstab
ARGC:命令行参数的个数
# awk 'BEGIN{print ARGC}' /etc/passwd /etc/passwd
ARGV: 数组,保存的是命令行所给定的各参数
# awk 'BEGIN{print ARGV[0]}' /etc/passwd /etc/fstab 显示的参数为awk 2.2 自定义变量
1. -v var=value
# awk -v test='hello gawk' '{print test}' 打印自定义变量test的值 2. 在program中直接定义
# awk 'BEGIN{test="hello gawk";print test}' 3. printf命令
格式化输出: printf FORMAT,item1,item2,...
格式符:
%c: 显示字符的ASCII码
%d,%i: 显示十进制整数
%e,%E: 科学计数法数值显示
%f: 显示为浮点数
%g,%G: 以科学计数法或浮点形式显示数值
%s: 显示字符串
# awk '{print "%s\n",$1}' /etc/fstab
# awk '{print "alen:%s\n",$1}' /etc/fstab
%u: 无符号整数
%%: 显示%自身
修饰符
#[.#]: 第一个数字控制显示的宽度,第二个#表示小数点后的精度,比如%3.1f
默认右对齐
-:左对齐
# awk -v FS=':' '{printf "Usernme:%-15s,UID:%d\n",$1,$3}' /etc/passwd
+: 显示数值的符号 4. 操作符
算术操作符
x+y, x-y, x*y, x/y, x^y, x%y
赋值操作符:
=,+=,*=,/=,%=,^=
++,--
比较操作符:
>,>=,<,<=,!=,==
模式匹配符:
~:是否匹配
!~:是否不匹配
逻辑操作符:
&&
||

函数调用
function_name(argu1,argu2,...)
条件表达式:
selector?if-true-expression:if-false-expression
示例: id号小于500为系统用户或者管理员,大于500为普通用户
# awk -v FS=':' '{$3<500?usertype="SysAdmin or SysUser" : usertype="common user";printf "%-15s,%-s\n",$1,usertype}' /etc/passwd 5.PATTERN
1. empty: 空模式,匹配每一行 2. /regular expression/: 仅处理能够被此处的模式匹配到的行 # awk '/^UUID/{print $1}' /etc/fstab
# awk '!/^UUID/{print $1}' /etc/fstab
# awk -F: '$NF~/bash$/{print $1,$NF}' /etc/passwd 3. relational expression: 关系表达式,结果有真有假;结果为真才会被处理:
真:结果为非0值,非空字符串 4. line renges:行范围
startline,endline: /pat1/,/pat2/
注意: 不支持直接给出数字的格式
# awk -F: '(NR>=2&&NR<=10){print $1}' /etc/passwd 5. BEGIN/END模式
BEGIN{}: 仅在开始处理文件中的文本之前执行一次
END{}: 仅在文本处理完成之后执行一次
# awk -F: 'BEGIN{print " username uid\n-----------------------------"}{printf "%-15s,%-10d\n",$1,$3}END{print "---------------------end---------------"}' /etc/passwd 6.常用的action
1. EXPRESSIONS
2. Control statements: if, while等
3. Compound statements:组合语句
4. input statements
5. output statements 7. 控制语句
if(confition) {statments}
if(condition) {statments} else {statements}
while(condition) {statements}
do {statements} while(condition)
break
continue
delete array[index]
delete array
exit
{ statements } 7.1 if-else
语法: if(condition) statement [else statement]
# awk -F: '{if($3>=500){printf "%s,%d\n",$1,$3} else {printf "SysadminUser:Username:%s,Uid:%d\n",$1,$3}}' /etc/passwd
# awk -F: '{if($NF=="/bin/bash"){print $0}}' /etc/passwd
# awk '{if(NF>5) print $0}' /etc/fstab
# df -h | awk -F% '/^\/dev/{print $1}' | awk '{if($NF>20)print $1}'
使用场景: 对awk取得的整行或某个字段做条件判断; 7.2 while循环
语法: while(condition) statement
条件“真”,进入循环;条件“假”,退出循环
# awk '/^[[:space:]]*/{i=1;while(i<=NF) {print $i,length($i);i++}}' /etc/grub2.cfg
# awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {if(length($i)>=7){print $i,length($i)}; i++}}' /etc/grub2.cfg
使用场景: 对一行内的多个字段逐一类似处理时使用;对数组中的各元素逐一处理时使用 7.4 for循环
语法: for(expr1;expr2;expr3) statement
for(variable assignment;iteration process) {for-body}
# awk '/^[[:space:]]*linux16/{for(i=1;i<NF;i++) {print $i,length($i)}}' /etc/grub2.cfg
特殊用法:
能够遍历数组中的元素:
语法: for (var in array) {for-body} 7.5 switch语句
语法: switch(expression) {case VALUE1 or /REGEXP/: statement; case VALUE2 or /REGEXP/: statement...default:statement} 7.6 break和continue
break [n]
continue 7.7 next
提前结束对本行的处理而直接进入下一行
# awk -F: '{if($3%2 !=0) next;print $1,$3}' /etc/passwd
8. array
关联数组: array[index-expression]
index-expression:
1.可使用任意字符串
2.如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为“空串”
若要判断数组中是否存在某元素,要使用“index in array”格式进行
weekdays[mon]="Monday"
若要遍历数组中的每个元素,要使用for循环
for(var in array) {for-body}
# awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";for(i in weekdays){print weekdays[i]}}'
注意: var会遍历array的每个索引
state["LISTEN"]++
state["ESTABLISHED"]++
# netstat -atn | awk '/^tcp/{state[$6]++}END{for(i in state){print i,state[i]}}'
# awk '{ip[$1]++}END{for(i in ip){print i,ip[i]}}' /var/log/httpd/access_log 练习1: 统计/etc/fstab文件中每个文件系统类型出现的次数
# awk '/^(\/dev|UUID)/{fstype[$3]++}END{for(i in fstype){print i,fstype[i]}}' /etc/fstab 练习2:统计指定文件中每个单词出现的次数
# awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count){print i,count[i]}}' /etc/fstab
9. 函数
9.1 内置函数
数值处理:
rand(): 返回0和1之间一个随机数
# awk 'BEGIN{print rand()}' 字符串处理:
length([s]): 返回指定字符串的长度
sub(r,s,[t]): 以r表示的模式来查找t所表示的字符中的匹配的内容,并将其第一次出现替换为s所表示的内容
gsub(r,s,[t]):以r表示的模式来查找t所表示的字符中的匹配的内容,并将其所有出现替换为s所表示的内容
split(s,a[],r):以r为分隔符切割字符串s,并将切割后的结果保存至a所表示的数组中,
注意: awk中的属组是从1开始编号
# netstat -atn | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for(i in count){print i,count[i]}}'

linux基础之awk的更多相关文章

  1. 【Linux基础】awk命令

    1.awk命令说明 (1)awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息 (2)awk处理过程:  依次对每一行进行处理,然后输出 ...

  2. Linux基础命令-Nginx-正则表达式( grep sed awk )-Shell Script--etc

    Linux基础使用 学习内容博客 内存 查看swap分区信息 > swapon -s 添加swap分区 > mkswap /dev/sdb2 > 激活 swapon -a /dev/ ...

  3. Linux基础入门

    第一节,linux系统简介 一.实验内容 了解 Linux 的历史,Linux 与 Windows 的区别等入门知识. 二.实验要求 阅读linux简介与历史 三.实验步骤 (一).Linux 为何物 ...

  4. 《信息安全系统设计基础》第一次实验报告--Linux 基础入门

    北京电子科技学院(BESTI) 实     验    报     告 课程:信息安全设计基础 班级:1352  姓名:何伟钦  学号:20135223 成绩:            指导教师:娄嘉鹏 ...

  5. Linux基础入门学习笔记20135227黄晓妍

    学习计时:共24小时 读书:1小时 代码:8小时 作业:3小时 博客:12小时 一.学习目标 1. 能够独立安装Linux操作系统   2. 能够熟练使用Linux系统的基本命令   3. 熟练使用L ...

  6. Linux基础入门(新版)(实验九-实验十二)

    实验九 简单文本入门 一.常用的文本处理命令 二.文本处理命令 1.tr 命令 tr 命令可以用来删除一段文本信息中的某些文字.或者将其进行转换. 使用方式: tr [option]...SET1 [ ...

  7. ###Linux基础 - 2

    点击查看Evernote原文. #@author: gr #@date: 2014-10-13 #@email: forgerui@gmail.com 一.Linux基础命令2 mount: 挂载U盘 ...

  8. (大数据工程师学习路径)第一步 Linux 基础入门----正则表达式基础

    介绍 虽然我们这一节的标题是正则表达式,但实际这一节只是介绍grep,sed,awk这三个命令,而正则表达式作为这三个命令的一种使用方式(命令输出中可以包含正则表达式).正则表达式本身的内容很多,要把 ...

  9. Linux实战教学笔记18:linux三剑客之awk精讲

    Linux三剑客之awk精讲(基础与进阶) 标签(空格分隔): Linux实战教学笔记-陈思齐 快捷跳转目录: * 第1章:awk基础入门 * 1.1:awk简介 * 1.2:学完awk你可以掌握: ...

随机推荐

  1. Spring-boot(二)--thymeleaf

    @Controller @RequestMapping("/") public class MessageController { private final MessageRep ...

  2. python3 中 Event.wait 多线程等待

    event.wait(time) 等待 time 时间后,执行下一步.或者在调用 event.set() 后立即执行下一步. event.clear()  清除信号 event.set() 设置信号 ...

  3. rails 杂记 - model 中的exists?

    1. exists? 用法 有一段代码 参考 def generate_token(column) begin self[column] = SecureRandom.urlsafe_base64 e ...

  4. STL之pair对组

    #include<iostream> #include<algorithm> #include<cstring> #include<cstdlib> u ...

  5. ArcGIS AddIn调用ArcMap自带的对话框

    ESRI.ArcGIS.Framework命名空间提供了ArcGIS常用的一些对话框,可以在开发时直接调用这些对话框,而不需要重新去写Form 主要对话框有 1.IColorBrowser/IColo ...

  6. python中元组与数组的区别

    列表: a=['12', '3rr'] 元组: t=(21,34) 列表可以修改,而元组不可以修改,如果元组中仅有一个元素,则要在元素后加上逗号. 元组和列表的查询方式一样. 元组只可读不可修改. 如 ...

  7. C#常用加密方法

    using System; using System.IO; using System.Security.Cryptography; using System.Text; /// <summar ...

  8. The way to unwind the stack on Linux EABI

    I. probe the stack frame structure The original idea is to unwind the function call stack according ...

  9. Xmodem协议简介

    1.      Xmodem协议 1.1.    简介 在上一章中,BootLoader和APP在串口下的升级其实都用到了一种文件传输协议,即Xmodem协议,该协议因其简单,易实现和使用的特点在很多 ...

  10. LeetCode 1013 Partition Array Into Three Parts With Equal Sum 解题报告

    题目要求 Given an array A of integers, return true if and only if we can partition the array into three  ...