常用命令--sed&awk

一、执行过程

当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的后缀部分

你可能感兴趣的:(常用命令--sed&awk)