Linux文本处理工具有三三两两款款就此底较多,sed&awk。sed是一致磨蹭流编辑器,而awk是同等山头脚本语言。从效益上说道,awk可以了代表sed;从进度直达讲话,awk一般如果慢于sed。jiayi一直是awk的fans,现在便完美的牵线一下awk^_^

sed工具简介

概述**
awk 是相同栽编程语言,她是出于AT&T 贝尔实验室的Alfred Aho, Peter
Weinberger 和Brian Kernighan开发的,Brian
Kernighan(此公大家不生疏吧~)
目前据在维护及增长awk。awk的语法与C类似。**

用法:
sed [-nefri] 动作
参数:
-n:使用安静模式(Silent)模式,一般以sed的
用法中,所有来STDIN的数目貌似还见面列于屏幕及。但假如是长-n参数后,则只有经过sed特殊处理的那么一行(或操作)才见面给列下
-e:直接以命令行模式上进展sed的动作编排
-f:直接拿sed的动作写以一个文本内,-f
filename则可以实行filename内之sed动作。
-r:sed的动作支持之是扩展型正则表达式的语法(默认是基础正则表达式的语法)
-i:直接改动读取的文本内容,而非是由屏幕输出
动作说明:
[n1 [,n2]] function
n1,n2不显现得会存在,一般代表选择进行动作的行数,举例来说,如果自己之动作是急需以10交20行中展开的,则”10,20[动作表现]”

function有以下这些参数:
a:新增,a后面可以连接字符串,而这些字符串会以初的一行出现(目前底产一行)
c:替换,c后面可以通字符串,这些字符串可以替换n1,n2之间的执行
d:删除,因为是删除,所以d后面通常不连贯任何参数
i:插入,i的尾可以通字符串,而这些字符串会于初的一行出现(目前的达标一行)
p:打印,也不怕是以有选项的多少打印出来,通常p会与参数sed -n 一起运行
s:替换,可以直接进行轮换的做事,通常这s的动作好搭配正则表达式,例如1,20s/old/new/g即是

调用
1.awk ‘pattern-action statements’
input_file_list
2.以awk命令插入一个文书,并设awk程序可以尽,然后用awk命令解释器作为脚本首行。
3.将持有awk命令插入一个独立文件
    awk -f awk-script-file
inputfile

范例:

模式与动作
一个awk 程序是由同样层层之”模式-动作”语句构成的:
pattern {action}
pattern {action}
pattern {action}
……

范例同:将 /etc/passwd 的情列有,并且自己索要打印行号,同时,请以第
2~5 行删除!
[root@linux ~]# nl /etc/passwd |sed ‘2,5d’
1 root:x:0:0:root:/root:/bin/bash
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
…..(后面省略)…..
看到了咔嚓?因为 2-5 行给他抹了,所以展示的数码中,就从不 2-5
行啰~
另外,注意一下,原本应是只要下达 sed -e 才对,没有 -e 也实行啊!
还要为要小心的凡, sed 后面接的动作,请务必以 ”
两单单引号括住喔!
设若,如果假定去第 2 行,可以动用 nl /etc/passwd | sed ‘2d’
来齐,
至于第 3 到结尾一行,则是 nl /etc/passwd | sed ‘3,$d’ 的呀!

范例二:承上题,在第二履行后(亦即凡加于第三实施)加上『drink
tea?』字样!
[root@linux ~]# nl /etc/passwd |sed ‘2a drink tea’
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
function有以下这些参数:
a:新增,a后面可以接字符串,而这些字符串会当新的一行出现(目前之生一行)
c:替换,c后面可以连接字符串,这些字符串可以轮换n1,n2之间的履行
d:删除,因为凡去,所以d后面通常不接任何参数
i:插入,i的后边可以连接字符串,而这些字符串会在新的一条龙出现(目前底上一行)
p:打印,也就算是以某选项的数打印出来,通常p会与参数sed -n
一起运行
s:替换,可以直接进行轮换的做事,通常这s的动作好搭配正则表达式,例如1,20s/old/new/g就算是

范例:

>>范例一:将 /etc/passwd
的情节列有,并且我要打印行号,同时,请以第 2~5 行删除!
[root@linux ~]# nl /etc/passwd |sed ‘2,5d’
1 root:x:0:0:root:/root:/bin/bash
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
…..(后面省略)…..
顾了吧?因为 2-5 行给他抹了,所以展示的数据遭到,就从来不 2-5
行啰~
另外,注意一下,原本应是设下达 sed -e 才对,没有 -e 也实践呐!
以也使顾的凡, sed 后面接的动作,请务必以 ”
两个单引号括住喔!
设若,如果要去第 2 行,可以下 nl /etc/passwd | sed ‘2d’
来上,
至于第 3 到结尾一实行,则是 nl /etc/passwd | sed ‘3,$d’ 的啦!

>>范例二:承上题,在第二实施后(亦即是加于第三实践)加上『drink
tea?』字样!
[root@linux ~]# nl /etc/passwd |sed ‘2a drink tea’
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
drink tea
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
哈哈!在 a
后面长的字符串就早已用应运而生于次实行后啰!那若是只要以其次推行前也?
nl /etc/passwd | sed ‘2i drink tea’ 就对啦!

范例三:在次执行后加入两实施字,例如『Drink tea or …..』『drink
beer?』
[root@linux ~]# nl /etc/passwd | sed ‘2a Drink tea or ……
drink beer ?’
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
Drink tea or ……
drink beer ?
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
是范例的要害是,我们得激增不只一行喔!可以激增好几尽~
而是各个一行之间还要要以反斜线 \
来开展新行的加码喔!所以,上面的例证中,
咱俩可以窥见于率先实践的终极给就发出 \ 存在哪!那是早晚要是的喔!

范例四:我怀念拿第2-5推行之始末取代成为『No 2-5 number』呢?
[root@linux ~]# nl /etc/passwd | sed ‘2,5c No 2-5 number’
1 root:x:0:0:root:/root:/bin/bash
No 2-5 number
6 sync:x:5:0:sync:/sbin:/bin/sync
无了 2-5 行,嘿嘿嘿嘿!我们而的多寡就是应运而生啊!

范例五:仅排有第 5-7 行
[root@linux ~]# nl /etc/passwd | sed -n ‘5,7p’
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
为何要加 -n 的参数为?您可以自动下达 sed ‘5,7p’
就了解了!(5-7行会重复输出)
生没发生增长 -n 的参数时,输出的数据可差多底喔!

范例六:我们得以下 ifconfig 来排有 IP ,若只要 eth0 的 IP 时?
[root@linux ~]# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:51:FD:52:9A:CA
inet addr:192.168.1.12 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::250:fcff:fe22:9acb/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
….(以下简单)…..
事实上,我们而的就是老大 inet addr:..那一行而已,所以啰,利用 grep 与
sed 来捉
[root@linux ~]# ifconfig eth0 | grep ‘inet ‘ | sed
‘s/^.addr://g’ |
sed ‘s/Bcast.
$//g’
君得以每个管线 (|) 的经过都分别来施行,就会见掌握原因啰!
去头去尾之后,就见面取得我们所要之 IP 亦即是 192.168.1.12 啰~

范例七:将 /etc/man.config 档案的情节中,有 MAN 的设定就取下,但并非说明内容。
[root@linux ~]# cat /etc/man.config | grep ‘MAN’| sed ‘s/#.$//g’ | \
sed ‘/^$/d’
每一行当中,若发生 # 表示该行为批注,但是一旦留心的凡,有时候,
批注并无是描摹在首先独字符,亦即凡摹写于有指令后,如下面的样子:
『shutdown -h now # 这个是关机的吩咐』,批注 # 就以指令的后了。
因此,我们才会以及用 #.
$ 这个专业表示拟!

范例八:利用 sed 直接在 ~/.bashrc 最后一行在『# This is a test』
[root@linux ~]# sed -i ‘$a # This is a test’ ~/.bashrc
上头的 -i 参数可以叫你的 sed 直接去窜后面接的档案内容喔!而休是出于屏幕输出。
至于那个 $a 则表示最终一履才新增的意

awk
程序吗每个输入行依次地进行各一个”模式”的相当寻找,对各一个相当上的模式实行相应的”动作”,接着读取下一行并重复开始匹配,直到有的输入还处理完毕。

awk工具

当相同长达告句被好简单”模式”或者”动作”,缺省的模式吗配合配所有执行,缺省之动作呢出口当前施行:print
$0。无论何时,动作都不能不用花括号引起来。

故而法:awk ‘条件类型1{动作1} 条件类型2{动作2} …’ filename

awk
从输入被同样糟糕读取一行(一长条记下),缺省的行分割符(记录分割符)为\n。

awk主要是拍卖各一行的字段内之数据,而默认的字段的隔符为空格符或[Tab]键

下一场awk
将记录分割为一个个之字段,缺省之字段分割符也“Blank”(空白)。一行中的率先独字段称为$1,第二个字段称为$2,.
. . ,整个记录称$0。

以各一行的每个字段都是来变量名称的,那即便是$1,$2等变量名称
$0代表的是一整行数据的意思
整整awk的处理流程是:
1.读入第一推行,并以率先履行的数目填$0,$1,$2等变量
2.根据法类型的克,判断是否要开展末端的动作
3.做得了所有的动作与规范类型
4.若还有后续之”行”的数目,则更上面的1~3的步骤,直到有的数额都念了为止
awk是因行同不善拍卖的单位,而因字段为极小之处理单位

变量名称 代表意义
NF 每一样实施($0)拥有的字段总数
NR 目前awk所拍卖的是”第几执”数据
FS 目前之分隔符,默认是空格符

awk的吩咐形式:
awk [-F|-f|-v] ‘BEGIN{} //{command1;command2} END{}’ file

[-F|-f|-v]:大参数,-F用于指定分隔符,-f调用脚本,-v定义变量var=value
‘ ‘:引用代码块
BEGIN:初始化代码块,在对各个一样履进行拍卖之前,初始化代码,主要是引用全局变量,设置FS分隔符
//:匹配代码块,可以是字符串或者是正则表达式
{}:命令代码块,包含一长长的或多长长的命令
;:多长条命令下分号分割
END:结尾代码块,在针对各个一样实践开展处理下还实施的代码块,主要是开展末段计算还是输出结尾摘要信息

特要点:
$0:表示目前推行
$1:表示每一行的第一个字段
FNR:与NR类似,不过大多文本记录不递增,每个文件还由1初始
FS:BEGIN时定义之相间符
RS:记录之分隔符,默认为转移行符(即文本是比照一行一行来读取的)
+:匹配时表示1单或1只以上
/[0-9][0-9]+/:两独或少于独以上数字
/[0-9][0-9]*/:一个要么一个以上数字
OFS:输出字段分隔符,默认是空格,也足以是制表符等
ORS:输出的记录分隔符,默认为转移行符,即处理结果也是按部就班一行一行输出屏幕的

打印
一个动作好没有模式,在这种状态下动作在有着行上执行。最简易的动作是打印某些或有的记录;这好透过
awk 命令 print 来形成。awk 程序{ print
}打印每个记录,也不怕是把输入完的复制到输出。更实用的凡打印来自每个记录之一个字段或一些字段。例如

范例

CODE

print & $0
print 是awk打印指定内容之要害命令
awk ‘{print}’ /etc/passwd == awk ‘{print $0}’ /etc/passwd
awk ‘{print ” “}’ /etc/passwd
//不输出passwd的始末,而是输出相同个数的空行,进一步解释了awk是单排一行处理公事
awk ‘{print “a”}’ /etc/passwd //输出相同个数的a行,一行只有一个a字母
awk -F”:” ‘{print $1}’ /etc/passwd
awk -F: ‘{print $1; print $2}’ /etc/passwd
//将每一行的前方亚个字段,分行输出,进一步了解一行一行处理文件
awk -F: ‘{print $1,$3,$6}’ OFS=”\t” /etc/passwd
//输出字段1,3,6,以制表符作为分隔符

-f指定脚本文件
awk -f script.awk file
BEGIN{
FS=”:”
}
{print $1} //效果与awk -F”:” ‘{print
$1}’相同,只是分隔符使用FS在代码自身面临指定

awk ‘BEGIN{X=0} /^$/{ X+=1 } END{print “I find”,X,”blank lines.”}’
test
I find 4 blank lines.
ls -l|awk ‘BEGIN{sum=0} !/^d/{sum+=$5} END{print “total size
is”,sum}’
//计算文件大小
total size is 17487

-F指定分隔符
$1 指指定分隔符后,第一只字段,$3叔独字段, \t是制表符
一个还是多单连续的空格或制表符看做一个定界符,即多独空格看做一个空格
awk -F”:” ‘{print $1}’ /etc/passwd
awk -F”:” ‘{print $1 $3}’ /etc/passwd //$1与$3相并输出,不分隔
awk -F”:” ‘{print $1,$3}’ /etc/passwd
//多矣一个逗号,$1与$3使用空格分隔
awk -F”:” ‘{print $1 ” ” $3}’ /etc/passwd
//$1与$3之间手动添加空格分隔
awk -F”:” ‘{print “Username:” $1 “\t\t Uid:” $3 }’ /etc/passwd
//自定义输出
awk -F: ‘{print NF}’ /etc/passwd //显示每行有些许字段
awk -F: ‘{print $NF}’ /etc/passwd //将每行第NF独字段的值打印出来
awk -F: ‘NF==4 {print }’ /etc/passwd //显示就发生4只字段的实施
awk -F: ‘NF>2{print $0}’ /etc/passwd //显示每行字段数量超过2之尽
awk ‘{print NR,$0}’ /etc/passwd //输出每行的行号
awk -F: ‘{print NR,NF,$NF,”\t”,$0}’ /etc/passwd
//依次打印行号,字段往往,最后字段值,制表符,每行内容
awk -F: ‘NR==5{print}’ /etc/passwd //显示第5行
awk -F: ‘NR==5 || NR==6{print}’ /etc/passwd //显示第5行和第6行
route -n|awk ‘NR!=1{print}’ //不显示第一实施

//匹配代码块
//纯字符匹配 !//纯字符不匹配 ~//字段值匹配 !~//字段值未匹配配
~/a1|a2/字段值匹配a1要么a2
awk ‘/mysql/’ /etc/passwd
awk ‘/mysql/{print }’ /etc/passwd
awk ‘/mysql/{print $0}’ /etc/passwd //三长达指令结果一律
awk ‘!/mysql/{print $0}’ /etc/passwd //输出非配合配mysql的履行
awk ‘/mysql|mail/{print}’ /etc/passwd
awk ‘!/mysql|mail/{print}’ /etc/passwd
awk -F: ‘/mail/,/mysql/{print}’ /etc/passwd //区间匹配
awk ‘/[2][7][7]*/{print $0}’ /etc/passwd
//匹配包含27为数字开头的实践,如27,277,2777…
awk -F: ‘$1~/mail/{print $1}’ /etc/passwd //$1匹配指定内容才显示
awk -F: ‘{if($1~/mail/) print $1}’ /etc/passwd //与方一样
awk -F: ‘$1!~/mail/{print $1}’ /etc/passwd //不匹配
awk -F: ‘$1!~/mail|mysql/{print $1}’ /etc/passwd

awk ‘{print $2, $1}’ filename

依照逆序打印前少单字段。在 print
语句子被因故逗号分隔的起,在输出的当儿会就此时出口字段分隔符分隔开。没有就此逗号分隔的项会串联起,所以

CODE

awk ‘{ print $1 $2 }’ filename

将第一独跟次独字段合在一起。

足采取预定义的变量 NF 和 NR;例如

CODE

awk ‘{ print NR, NF, $0 }’ filename

打印出前导了记录数和配段往往的每个记录。

出口可以让重定向到几近单文本被

CODE

awk ‘{ print $1 >”foo1″; print $2 >”foo2″
}’ filename

形容第一只字段 $1 到文件 foo1 中,写第二个字段到文件 foo2 中。还好以
>> 符号:

CODE

awk ‘{ print $1 >>”foo” }’ filename

补加输出到文件 foo。(在各级种情形下,输出文件都在必要经常成立)。

文本称好是一个变量或字段,同常量一样;例如

CODE

awk ‘{ print $1 >$2 }’ filename

运字段 2 的内容作为文件名字。

自的,有针对性输出文件数量的限,目前凡 10 单。

awk 还提供 printf 语句子用于出口格式化:
    printf format,expr, expr, …
冲在 format 中之确定格式化在列表中的表达式并打印它们。例如,

CODE

awk ‘{ printf “%8.2f %10ld\n”, $1, $2 }’
filename

打印 $1 为 8 各项富有的有点数点后出少数各之浮点数,打印 $2 吗 10
个长的长十进制数,并跟随着一个换行。不自动生成输出分隔符;你得自己多其,如是例子那样。这个本子的printf
同于C 所祭的。

输出
1.抽取域

 

CODE

awk -F: ‘{print $1}’ /etc/passwd # -F 指定字段分割符

2.保留输出

 

CODE

awk -F: ‘{print $1}’ /etc/passwd | tee user

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

3.行使正式输出

CODE

awk ‘/root/’ /etc/passwd #
/xxx/为正则表达式,表示打印带有”root”的行

4.打印所有记录

CODE

awk ‘{print $0}’ /etc/passwd

5.打印表头

CODE

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

6.打印表尾

 

CODE

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

极操作符
1.匹配

 

CODE

awk ‘{if($1~/root/) print $0}’ /etc/passwd    #要是field1含”root”,打印该行

2.确切匹配
!=  ==

3.不匹配
!~

4.大大小小比较
> >= < <=

5.安大小写

CODE

awk ‘/^[Rr]oot/’ /etc/passwd #
打印带有行首为Root或者root的实施

6.任意字符

CODE

awk ‘$2~/^…a/’ /etc/passwd #
打印第二独字段开头第四独字母为t的行

7.还是提到相当

CODE

awk ‘/(root|ftp)/’ /etc/passwd #打印带有”root365bet体育投注”或者”ftp”的行

8.AND &&    OR  ||

CODE

awk ‘{$1~/mail/ && $7==/bin/bash}’ /etc/passwd

网变量:

ARGV 命令行参数数组
ENVIRON 环境变量数组
FILENAME 当前输入文件名
FNR 当前文件中的记录号
FS 字段分隔符
IGNORECASE 忽略正则表达式和串的大小写
NF 当前记录中的字段数
NR 至今读取的记录数
OFMT 数的输出格式,缺省为"%.6g"
OFS 输出字段分隔符
ORS 输出记录分隔符
RS 输入记录分隔符
RSTART 由match() 匹配的第一个字符的索引
RLENGTH 由match() 匹配的串的长度
SUBSEP 下标分隔符,缺省为"�34"

 

放字符串函数

gsub(r,s,t) 在字符串t中,用字符串s替换和正则表达式r匹配的所有字符串。返回替换的个数。如果没有给出t,缺省为$0
index(s,t)   返回s 中字符串t 的位置,不出现时为0
length(s) 返回字符串s 的长度,当没有给出s时,返回$0的长度
match(s,r) 返回r 在s 中出现的位置,不出现时为0。设置RSTARTRLENGTH的值
split(s,a,r) 利用r 把s 分裂成数组a,返回元素的个数。如果没有给出r,则使用FS。数组分割和字段分割采用同样的方式
sprintf(fmt,expr_list)   根据格式串fmt,返回经过格式编排的expr_list
sub(r,s,t) 在字符串t中用s替换正则表达式t的首次匹配。如果成功则返回1,否则返回0。如果没有给出t,默认为$0
substr(s,p,n) 返回字符串s中从位置p开始最大长度为n的字串。如果没有给出n,返回从p开始剩余的字符串
tolower(s) 将串s 中的大写字母改为小写,返回新串
toupper(s) 将串s 中的小写字母改为大写,返回新串

 

gsub(r,s,t):

CODE

echo ababab |
awk ‘gsub(/a/,”c”)’ # cbcbcb

sub(r,s,t)

CODE

echo ababab |
awk ’sub(/a/,”c”)’  # cbabab

其余函数自行尝试。

坐算术函数

cos(x)    返回x的余弦值
sin(x) 返回x的正弦值
int(x) 返回x的整数部分
log(x) 返回x的自然对数
sqrt(x) 返回x的平方根
antan2(x)       返回y/x的反正切,值在 -π到 π之间
rand() 返回随机数r,0 <= r < 1
srand(x) 建立rand()的随机种子,如果没有指定种子,则按当天时间。返回旧的种子

 

cos(x):

CODE

CODE

pai=$(echo “scale=66; a(1)*4” | bc -l)
awk -va=$pai ‘BEGIN{print cos(a/4)}’ OR awk ‘BEGIN{print cos(’$pai‘/4)}’ #0.707107

旁函数自行尝试。     

附算术运算符

x^y x的y次幂
x**y 同上
x%y 计算x/y的余数(求模)
x+y x加y
x-y x减y
x*y x乘y
x/y x除y
-y 负y(y的开关符号);也如一目减
++y y加1后使用y(前置加)
y++ 使用y值后加1(后缀加)
–y y减1后使用y(前置减)
y– 使用后y减1(后缀减)
x=y 将y的值赋给x
x+=y 将x+y的值赋给x
x-=y 将x-y的值赋给x
x*=y 将x*y的值赋给x
x/=y 将x/y的值赋给x x%=y 将x%y的值赋给x
x^=y 将x^y的值赋给x
x**=y 将x**y的值赋给x

假如您喜爱本文,欢迎订阅我的文章:365bet体育投注 1http://feed.jiayii.com

转载请注明出处:http://www.jiayii.com/awk-tutorial/

此外一个念AWK的资源 http://www.aslibra.com/doc/awk.htm

http://www.math.utah.edu/docs/info/gawk_6.html 

 

相关文章

网站地图xml地图