awk的惊人表现

awk能够胜任差点儿全部的文本处理工作。

 

 

awk

调用

1.调用awk:

方式一:命令行方式

awk [-F field-separator ] ‘commands’ input-file(s)

[ -F域分隔符 ]是可选的,由于awk使用空格作为缺省的域分隔符,因此假设要浏览域间有空格的文本,不必指定这个选项,假设要浏览比如passwd文件.此文件名称域以冒号作为分隔符,则必须指明-F选项,如:

awk -F ‘commands’ input-file

 

方式二:将全部awk命令插入一个文件,并使阿瓦库程序可运行,然后用awk命令解释器作为脚本的首行,以便通过键入脚本名成功来调用它.

 

方式三:将全部的awk命令插入一个单纯文件,然后调用:

awk -f awk-script-file input-file(s)

-f选项指明在文件awk_script_file中的awk脚本,input_file(s)是使用awk进行浏览的文件名称.

 

 

模式和动作

 

不论什么awk语句都是有模式和动作组成.在一个awk脚本中可能有非常多语句,模式部分决定动作语句何时触发以及出发时间.处理即对数据进行的操作.假设省略模式部分,动作将时刻保持运行状态.模式能够是不论什么条件语句或符合语句或正則表達式.模式包括两个特殊字段BEGIN和END.使用BEGIN语句设置计数和打印头.BEGIN语句使用在不论什么文本浏览动作之前,之后文本浏览动作一句输入文本開始运行.END语句用来在awk完毕浏览动作后打印输出文本总数和结尾状态标识.

 

域和记录

使用$1,$3表示參照第一个和第三个域,注意这里使用逗号做域切割,假设希望打印一个有5个域的记录的全部域,可使用$0,意即全部域.

为打印一个域或全部域,使用printf命令,这是一个awk动作

 

模式和动作

模式:两个特殊段BEGIN和END

动作:实际动作大多在{}内指明

 

输出:

1.抽取域

命令:awk -F: '{print $1}' /etc/passwd

输出:打印/etc/passwd文件夹下的全部username

 

2.保存输出

awk -F: ‘{print $1}’ /etc/passwd |tee user  使用tee命令,在输出文件的同一时候,输出到屏幕

 

3.使用标准输出

awk -F : ‘{print $1}’ /etc/passwd > user3

 

4.打印全部记录

awk -F : ‘{print $0}’ /etc/passwd

5.打印单独记录

awk -F: ‘{print $1,$4}’ /etc/passwd

 

6.打印报告头

awk -F : ‘BEGIN{print “NAME\n”}{print $1}’ /etc/passwd

 

7.打印结尾

awk -F: ‘{print $1}END{print “this is all users\n”}’ /etc/passwd

 

条件操作符

1.匹配

awk -F : '{if($1~/root/) print}' /etc/passwd 

分析:if($1~/roo/t) 表示假设file中包括root,打印他

 

2.精确匹配

使用符号==

awk -F: '{if($3==0) print}' /etc/passwd

 

3.不匹配

!~

awk -F: '{if($1!~/linuxone/) print}' /etc/passwd

精确不匹配

!=

awk -F: '{if($1!=/linuxone/) print}' /etc/passwd

 

4.小于

<

5.小于等于

<=

6.大于

>

7.设置大写和小写

awk ‘/[Rr]oot’ /etc/passwd

 

8.随意字符

awk -F : '{f($1~/^...t/) print}' /etc/passwd

分析:if($1~/^...t/)表示第四个字母是t

 

9.或关系匹配

awk -F : '{if($1~/(squid|nagios)/) print}' /etc/passwd

 

10.行首

awk '/^root/' /etc/passwd

分析:^root(行首包括root)

11 AND &&

awk -F : '{if($1=="root"&&$3=="0") print}' /etc/passwd

 

12.OR ||

 

内置变量:

变量名

含义

ARCC

命令行參数个数

ARGV

命令行參数列表

ENV |RON

支持队列中的系统环境变量的使用

FNR

浏览文件的记录数

FS

置顶分隔符,等价于-F

NF

浏览记录的域的个数

NR

一度的记录数

OFS

输出域分隔符

ORS

输出记录分隔符

RS

控制记录分隔符

 

案例:

打印有多少行记录

awk 'END{print NR}' /etc/passwd

 

设置输入域到变量名

awk -F : '{name=$1;path=$7; if(name~/root/)print name"\tpath is : " path}' /etc/passwd

 

域值比較操作

awk '{if($6<$7) print $0}' input-file

 

改动文本域仅仅显示改动的记录

awk -F : '{if($1=="root"){$1="nagios server" ; print}}' /etc/passwd  

 

文件长度相加

ls -l | awk '/^[^d]/ {print $9"\t" $5}{tot+=$5}\

 END {print "total kb:"tot}'

 

 

 

 

内置的字符串函数

gsub(r,s)

在整个$0中s替换r

gsub(r,s,t)

在整个t中s替换r

index(s,t)

返回s中字符串t的第一位置

length(s)

返回s长度

match(s,r)

測试s中是否包括匹配r的字符串

split(s,a,fs)

在fs上将s分成序列a

sub(s,)

用$0中最左边也是最长的字符串替代

subtr(s,p)

返回字符串s中从p開始的后缀部分

substr(s,p,n)

返回字符串s中从p開始长度为n的后缀部分

 

1.gsub

awk 'gsub(/^root/,"netseek") {print}' /etc/passwd  #将以root开头的字符串替换为netseek并打印

 

awk 'gsub(/0/,2){print}' /etc/passwd

 

awk '{print gsub(/0/,2) $0}' /etc/fstab

 

2.index

awk 'BEGIN{print index("root","o")}'  #查询o在root字符串中出现的第一位置

 

awk -F : '$1=="root" {print index($1,"o")" " $1}' /etc/passwd

 

awk -F : '{print index($1,"o") $1}' /etc/passwd

 

3.length

awk -F : '{print length($1)}' /etc/passwd

 

wk -F : '$1=="root"{print length($1)"\t" $0}' /etc/passwd

 

4.match(在ANCD中查找C的位置)

awk 'BEGIN{print match("ANCD","C")}'

 

5.split返回字符串数组元素个数

awk 'BEGIN{print split("123#456#789",array,"#")}'

 

6.sub仅仅能替换指定域的第一个0

awk 'sub(/0/,2){print }' /etc/fstab

 

7.substr 依照起始位置以及长度返回字符串的一部分

awk 'BEGIN{print substr("www.baidu.com",5,9)}' #第五个子夫開始,取9个字符

 

awk 'BEGIN{print substr("www.baidu.com",5)}'  #第五个位置開始,一直到最后

 

字符串屏蔽序列

符号

含义

\b

退格符

\f

走纸换页

\n

新行

\r

回车

\t

tab键(四个空格)

\c

随意其它特殊字符

\ddd

八进制

 

案例:

awk -F : '{print $1,"\b" $2,"\t" $3}' /etc/passwd

分析:print和printf两者效果不同

 

printf修饰符

-  : 左对齐

width : 域的步长0表示0步长

.prec : 最大字符串长度,或小数点右边的位数

 

awk printf格式

符号

含义

%c

ASCII字符

%d

整数

%e

科学计数法

%f

浮点数

%g

awk决定使用哪种浮点数转换,e或者f

%o

八进制数

%s

字符串

%x

十六进制

 

1.字符串转换

echo "65" | awk '{printf "%c\n", $0}'

 

awk 'BEGIN{printf "%c\n" ,65}'

 

awk 'BEGIN{printf "%f\n",999}'

 

2.格式化输出

awk -F : '{printf "%-15s %s\n",$1,$3}' /etc/passwd

 

awk -F : 'BEGIN{printf "USER\t\tUID\n"}{printf "%-15s %s\n",$1,$3}' /etc/passwd

 

3.向一行awk命令传值

who | awk '{if ($1==user) print $1 " you are connected :" $2}' user=$LOGNAME

 

4.awk脚本文件(在文件名称字后面加后缀.awk翻遍区分)

#!/bin/awk -f

BEGIN{

        FS=":"

        print "User\t\tUID"

        print "----------------"

}

 

{printf "%-15s %s\n",$1,$3}

 

END{

        print "end"

}

 

分析:awk脚本文件开头一般都是这种:#!/bin/awk -f

已经指明了 -f 选项。

运行时,直接在awk脚本名后面加要处理的文件名称作为參数就可以。

 

shell学习四十天----awk的惊人表现的更多相关文章

  1. shell学习四十九天----进程建立

    进程 前言:进程指的是运行中程序的一个实例.新进程由fork()与execve()等系统调用所起始,然后运行,知道他们下达exit()系统调用为止. linux系统都支持多进程.尽管计算机看起来像是一 ...

  2. shell 学习四十五天---xargs

    当 find 产生一个文件列表时,该列表提供给另一个命令有时是很有用的.案例: $touch abc.c erd.c oiy.c $ll ./erd.c ./abc.c ./oiy.c $find - ...

  3. Salesforce LWC学习(四十) dynamic interaction 浅入浅出

    本篇参考: Configure a Component for Dynamic Interactions in the Lightning App Builder - Salesforce Light ...

  4. shell学习三十四天----printf详解

    http://blog.csdn.net/shanyongxu/article/details/46744055

  5. shell学习(4)- awk

    简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...

  6. shell学习五十六天----延迟进程调度

    延迟进程调度 前言:大部分时候,我们都希望进程快点開始,开点结束,别卡.而shell的运行,也是在前一个命令后,立即接着运行下一个命令.命令完毕的速度是与资源的限制有关,且不在shell的权限下. 在 ...

  7. Shell学习(五)—— awk命令详解

    一.awk简介   awk是一个非常好用的数据处理工具,相对于sed常常作用于一整个行的处理,awk则比较倾向于一行当中分成数个[字段]处理,因此,awk相当适合处理小型的数据数据处理.awk是一种报 ...

  8. 简单介绍shell编程四剑客之awk

    概要:分别的作用 grep:文本过滤(模式:pattern)工具,grep,egrep,fgrep,擅长过滤. sed:stream editor 文本编辑工具:(流编辑器),擅长取行.替换. awk ...

  9. linux shell学习四

    Shell分支语句 case 值 in 模式1) command1 command2 command3 ;; 模式2) command1 command2 command3 ;; *) command ...

随机推荐

  1. 学习推荐《零起点Python大数据与量化交易》中文PDF+源代码

    学习量化交易推荐学习国内关于Python大数据与量化交易的原创图书<零起点Python大数据与量化交易>. 配合zwPython开发平台和zwQuant开源量化软件学习,是一套完整的大数据 ...

  2. jQuery判断字符串是否含有中文字符

    //判断字符串是不是中文String.prototype.isChinese = function () {    var reg = /[^\x00-\xff]/ig;//判断是否存在中文和全角字符 ...

  3. hibernate : object references an unsaved transient instance 问题

    save顺序问题---比如学生表和班级表..学生表里有班级ID的外键.一对多的关系. 你save的时候应该先save班级,再save学生..否则学生的外键没有对应的值,引发异常

  4. C++ lambda表达式 (一)

    为什么要lambda函数 匿名函数是许多编程语言都支持的概念,有函数体,没有函数名.1958年,lisp首先采用匿名函数,匿名函数最常用的是作为回调函数的值.正因为有这样的需求,c++引入了lambd ...

  5. ASP.NET中的几种弹出框提示

    B/S不像C/S那样一个MessageBox就可以弹出提示框,不过可以通过js的“Alert”来弹出消息,或者通过一些变种的js方法.下面我给大家介绍几种,希望大家喜欢. 四种弹出框代码: prote ...

  6. 【iOS开发-27】解决方式:An error was encountered while running(Domain=FBSOpenApplicationErrorDomain, Code=4)

    iOS simulator出现故障,提示: An error was encountered while running (Domain = FBSOpenApplicationErrorDomain ...

  7. Volley简单学习使用五—— 源代码分析三

    一.Volley工作流程图: 二.Network     在NetworkDispatcher中须要处理的网络请求.由以下进行处理: NetworkResponse networkResponse = ...

  8. UVA 12508 - Triangles in the Grid(计数问题)

    12508 - Triangles in the Grid 题目链接 题意:给定一个n∗m格子的矩阵,然后给定A,B.问能找到几个面积在A到B之间的三角形. 思路:枚举每一个子矩阵,然后求[0,A]的 ...

  9. 华为荣耀3C最新版ROM的root,(4.7.1和4.8.1等等通用方法)

    手头一台honor 3c的机器.应该是线刷的时候,把IMEI给刷掉了.导致移动2G卡无法上网. 刷了4.7.1或者4.8.1.尝试了全部方法都root失败了. 正好我手头有6582的代码.我想.既然系 ...

  10. jquery源码09 (6058 , 6620) css() : 样式的操作

    var curCSS, iframe, // swappable if display is none or starts with table except "table", & ...