shell学习四十天----awk的惊人表现
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的惊人表现的更多相关文章
- shell学习四十九天----进程建立
进程 前言:进程指的是运行中程序的一个实例.新进程由fork()与execve()等系统调用所起始,然后运行,知道他们下达exit()系统调用为止. linux系统都支持多进程.尽管计算机看起来像是一 ...
- shell 学习四十五天---xargs
当 find 产生一个文件列表时,该列表提供给另一个命令有时是很有用的.案例: $touch abc.c erd.c oiy.c $ll ./erd.c ./abc.c ./oiy.c $find - ...
- Salesforce LWC学习(四十) dynamic interaction 浅入浅出
本篇参考: Configure a Component for Dynamic Interactions in the Lightning App Builder - Salesforce Light ...
- shell学习三十四天----printf详解
http://blog.csdn.net/shanyongxu/article/details/46744055
- shell学习(4)- awk
简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...
- shell学习五十六天----延迟进程调度
延迟进程调度 前言:大部分时候,我们都希望进程快点開始,开点结束,别卡.而shell的运行,也是在前一个命令后,立即接着运行下一个命令.命令完毕的速度是与资源的限制有关,且不在shell的权限下. 在 ...
- Shell学习(五)—— awk命令详解
一.awk简介 awk是一个非常好用的数据处理工具,相对于sed常常作用于一整个行的处理,awk则比较倾向于一行当中分成数个[字段]处理,因此,awk相当适合处理小型的数据数据处理.awk是一种报 ...
- 简单介绍shell编程四剑客之awk
概要:分别的作用 grep:文本过滤(模式:pattern)工具,grep,egrep,fgrep,擅长过滤. sed:stream editor 文本编辑工具:(流编辑器),擅长取行.替换. awk ...
- linux shell学习四
Shell分支语句 case 值 in 模式1) command1 command2 command3 ;; 模式2) command1 command2 command3 ;; *) command ...
随机推荐
- PHP 相关配置
1. php-fpm的pool 编辑"php-fpm"配置文件"php-fpm.con" vim /usr/local/php/etc/php-fpm.conf ...
- 紫书 习题 10-44 UVa 11246 ( 容斥原理)
把k的倍数的删去(k, 2k, 3k--),但是k^2不应该删去,因为k已经删去,所以不存在某个数乘上k之后为k^2 所以k^2可以留下,然后因为有k^2,所以k^3就是k^2的k倍,所以k^3要删去 ...
- kettle(一)概述
近期两个月一直和kettle打交道,从開始的没听说过,到如今能够熟练运用,不得不说项目驱动下,学习东西是最快的.好了,尽管使用kettle应付项目的任务绰绰有余.可是还是想系统的学习一下,总结一下.比 ...
- Image与byte[]数组的相互转换
近期项目有个需求是关于图片操作的,须要将图片保存到数据库中.经过尝试才知道Image类型文件是不能直接存储到数据库中的.保存之前须要我们做一步转换:将Image转换成字节数组类型Byte ...
- BZOJ 2708 [Violet 1]木偶 DP
题意:id=2708">链接 方法: DP 解析: 这题太神辣. 做梦都没想到DP啊,反正我不会. 先谈一个我有过的错的想法. 最小费用最大流? 能匹配的边连费用为1的,不能匹配的连费 ...
- elasticsearch index 功能源码概述
从本篇开始,对elasticsearch的介绍将进入数据功能部分(index),这一部分包括索引的创建,管理,数据索引及搜索等相关功能.对于这一部分的介绍,首先对各个功能模块的分析,然后详细分析数据索 ...
- hadoop-2.6.0.tar.gz + hive-1.0.0.tar.gz + pig-0.15.0.tar.gz的安装
这里,为什么选择用hadoop-2.6.0.tar.gz + hive-1.0.0.tar.gz是为了搭配兼容. hadoop-2.6.0.tar.gz + hive-1.0.0.tar. ...
- [AngularFire] Firebase OAuth Login With Custom Firestore User Data
import { NgModule } from '@angular/core'; import { AuthService } from './auth.service'; import { Ang ...
- ubuntu-虚拟机分辨率设定
前两天下载的虚拟机,一直调节不好分辨率,就是说,全屏的时候,虚拟机要么是不能充满屏幕,要么就是在屏幕充满的时候,会出现显示不全,需要滚动条,给人的体验非常的不好.自己调节了好长时间都没有刚好合适的尺寸 ...
- Android学习笔记技巧之给文本加边框
BorderTextViews.Java package xiaosi.BorderTextView; import android.content.Context; import android.g ...