常用命令--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的后缀部分

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容

  • sed与awk实例 文本间隔 在每一行后面增加一空行 将原来的所有空行删除并在每一行后面增加一空行。这样在输出的文...
    stuha阅读 1,883评论 0 21
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,135评论 2 34
  • 本文承接之前写的三十分钟学会AWK一文,在学习完AWK之后,趁热打铁又学习了一下SED,不得不说这两个工具真的堪称...
    mylxsw阅读 4,382评论 3 74
  • 基础命令 主要的命令和快捷键 Linux系统命令由三部分组成:cmd + [options]+[operation...
    485b1aca799e阅读 1,086评论 0 0
  • 野兔子海尔(Hare), 正投入的在草原上,吃草。 猎鹰法尔肯(Falcon) 正在上空盘旋,盯着海尔。 猎人亨特...
    莫芮阅读 135评论 0 2