一、执行过程
当awk或sed正在执行一个脚本时,它们为每条记录执行如下过程:
1)顺序搜索每个模式pattern(正则表达式,使用//括住)直到发生一个匹配。
2)当发现匹配后,为输入行执行相应的动作(action)。
3)当动作(action)执行完毕,到达下一个模式pattern并重复第1步。
4)当所有的模式都试过一遍后,读取下一步。
在第4步执行前,sed显示被改动的记录,awk,必须手动显示这条记录。
sed的执行动作包括编辑某个间字母等的命令;awk动作通常是一个编程语句集合。
正则表达式
正规表达式的基本结构包括:
普通字符: 包括大小写字母,数字,字符
元字符即通配符:包括.点(点,匹配任何换行符外的字符),*(匹配*前的0或多个字符),[chars](匹配在chars中给出的任一个字符序列,可使用-指定字符范围),^(匹配某行的开始),$(匹配某行的结尾),\(\反斜线字符后的作为文字字符处理,用于说明某特殊模式或消除通配符的特殊含义)。
常用的正则表达式
/^$/ 空行
/^.*$/ 整行
/ */ 一个或多个空格
/<[^>][^>]*>/ HTML或XML标记
二、sed
sed [选项] ... {脚本} [动作] [输入文件]...
选项:
-n, --quiet, --silent 忽略默认输出整个文件的内容
-e 脚本, --expression=脚本 添加“脚本”到程序的运行列表,即执行多个编辑任务
-f 脚本文件, --file=脚本文件 添加“脚本文件”到程序的运行列表
--follow-symlinks 直接修改文件时跟随软链接
--posix 关闭所有 GNU 扩展
-r, --regexp-extended 在脚本中使用扩展正则表达式
-s, --separate 将输入文件视为各个独立的文件而不是一个长的连续输入
-u, --unbuffered 从输入文件读取最少的数据,更频繁的刷新输出
-i 直接修改读取的文件内容,而不是输出到终端
动作,(需要使用''单引号括住),格式 [n1[,n2]] function,function包括以下内容:
a:新增,a的后面可以接字符串,且这些字符串在指定的行数的下一行出现(默认增加的内容显示在当前的下一行)
c:取代,c的后面可以接字符串,取代n1,n2之间的行
d:删除,后面不跟任何信息
i:插入,i的后面可以接字符串,且字符串显示在指定行的上一行(默认增加的内容显示在当前的上一行)
p:列印,将某个选择的数据打印出,通常与-n一起运用
s:替换,
示例:
以行为单位的新增/删除
sed '2,5d' ,sed '3,$d' sed '2a drink tea' sed '2i drink tea '
[root@www ~]#nl/etc/passwd|sed'2a Drink tea or ......\> drink beer ?' #每一行之间都必须要以反斜杠『 \ 』来进行新行的添加喔!
以行为单位的替换与显示
sed '2,5c No 2-5 number' sed -n '5,7p'
cat seddlt | sed 's/^[ \t]*//g' 删除行首空格或tab键
cat seddlt | sed 's/[ \t]*$//g' 删除行尾空格和tab
数据的搜寻并显示 sed -n '/root/p'
数据的搜索并删除 sed '/root/d'
数据的搜寻并执行命令 sed -n '/bash/{s/bash/blueshell/;p;q}' #替换第一个bash关键字为blueshell,就退出
多点编辑
sed -e '3,$d' -e 's/bash/blueshell/'
sed支持的正则表达式
为什么不能上传图了呢,后期补上
三、awk内置变量
ARGC 命令行参数个数
ARGV 命令行参数数组
FILENAME awk浏览的文件名
FNR 当前记录数
FS 设置输入域分隔符,等价于命令行 -F选项,默认是空格
NF 当前记录中的字段个数,就是有多少列 ,$NF表示最后字段
NR 表示文件中的行号
OFS 输出域分隔符,默认空格
ORS 输出记录分隔符,默认换行符
RS 输入的记录分隔符,默认为换行符,仅用于gawk与mawk里的正则表达式
$0 指整条记录
$1-N 当前行的第N个域,字段间由FS分隔
ENVIRON UNIX环境变量
OFMT 数字的输出格式%.6g
RSTART 被匹配函数匹配的字符串首
RLENGTH 被匹配函数匹配的字符串长度
'$1~/u/' 显示第一列中包含u的行
四、调用AWK
awk [-F field-separator] [-v var=value ....] 'commands' [-----] [var=value ...] inputfile
awk [-F field-separator] [-v var=value ....] -f programfile [-----] [var=value ...] inputfile
awk 语句由模式与动作组成 。模式部分决定动作语句何时触发及触发事件。模式包括特殊字段BEGIN和END。BEGIN设置计数和打印头,该语句使用在任何文件浏览动作之前,之后文本浏览动作依据输入文件开始执行。END语句用来在awk完成文本浏览动作后打印输出文件总数和结尾状态标志。动作语句使用圆括号括起来。若无模式部分内容,则动作部分使用花括号
指定多个分隔符指定分割,使用-F '[分隔符]'
保存输出
awk命令结尾写入 |tee filename 在输出到文件的同时输出到屏幕。
字符串转数字
[root@jira ~]# awk 'BEGIN{a="100";b="10test10";print(a+b+0)}'
110
只需要将变量通过“+”连接运算。自动强制将字符串转为整形,非数字变0,发现第一个非数字字符,后面的自动忽略。
数字转为字符串
[root@jira ~]# awk 'BEGIN{a=100;b=100;c=(a""b);print c}'
100100
awk字符串连接操作
[root@jira ~]# awk 'BEGIN{a="a";b="b";c=(a+b);print c}'
0
[root@jira ~]# awk 'BEGIN{a="a";b="b";c=(a""b);print c}'
ab
正则表达式
awk中的正则表达式常量使用/内容/斜杠或引号""加以定界,某域匹配正则表达式,使用符号'~'连接,反匹配使用‘!~’,匹配两边模式之一 使用(内容1|内容2),必须使用圆括号
内置的字符串函数
g s u b ( r, s ) 在整个$ 0中用s替代r
g s u b ( r, s , t ) 在整个t中用s替代r
i n d e x ( s , t ) 返回s中字符串t的第一位置
l e n g t h ( s ) 返回s长度
m a t c h ( s , r ) 测试s是否包含匹配r的字符串
s p l i t ( s , a , f s ) 在f s上将s分成序列a
s p r i n t ( f m t , e x p ) 返回经f m t格式化后的e x p
s u b ( r, s ) 用$ 0中最左边最长的子串代替s
s u b s t r ( s , p ) 返回字符串s中从p开始的后缀部分
s u b s t r ( s , p , n ) 返回字符串s中从p开始长度为n的后缀部分