码迷,mamicode.com
首页 > 系统相关 > 详细

linux sed,awk详解

时间:2015-09-16 20:14:41      阅读:290      评论:0      收藏:0      [点我收藏+]

标签:linux sed awk

sed命令:
sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
sed使用参数
[root@www ~]# sed [-nefr] [动作]
-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。
但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e :直接在命令列模式上进行 sed 的动作编辑;
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
-i :直接修改读取的文件内容,而不是输出到终端。
s/regexp/replacement/:替换由regexp所匹配到的内容为replacement
w /path/to/somefile:把指定的内容另存至/path/to/somefile路径所指定的文件中
r /path/from/somefile:在文件的指定位置插入另一个文件的所有内容,完成文件合并    
function:
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法

1. 定址:定址用于决定对哪些行进行编辑。地址的形式可以是数字、正则表达式、或二者的结合。如果没有指定地址,sed将处理输入文件的所有行。

2.d,删除行

例1.[root@lys ~]# sed ‘2d‘ /etc/fstab

技术分享

例2.删除/etc/fstab第五行后所有的行,$代表末行

[root@lys ~]# sed ‘5,$d‘ /etc/fstab

技术分享

3.p命令:命令p用于显示模式空间的内容。默认情况下,sed把输入行打印在屏幕上,选项-n用于取消默认的打印操作。当选项-n和命令p同时出现时,sed可打印选定的内容。

例3.

[root@lys ~]# sed  -n ‘/UUID/p‘ /etc/fstab

技术分享

4.s命令:格式:sed ‘s/要替换的字符串/新的字符串/g‘   (要替换的字符串可以用正则表达式)

例4.1将/etc/fstab中的UUID 替换成AAID

技术分享

例4.2删除/etc/selinux/config文件中所有以#开头,后跟至少一个空白字符的行的行首的#和空白字符

技术分享

5.first~step:指定起始行,以及步长。w命令是读入一个文件内容

例5.1将/etc/passwd文件的奇数行保存到/tmp/passwd中,其中sed 1~2表示从第一行开始,以2行为一个跨度进行匹配

技术分享

技术分享

6.e选项:-e是编辑命令,用于sed执行多个编辑任务的情况下。在下一行开始编辑前,所有的编辑动作将应用到模式缓冲区中的行上。

例6.先匹配“root”的行,然后将“root”替换成“adm”

技术分享

7.i\命令:i\ 命令是在当前行的前面插入新的文本。

例7.在/etc/passwd的第四行前插入test

技术分享

8.r命令:r命令是读命令。sed使用该命令将一个文本文件中的内容加到当前文件的特定位置上。

技术分享

9.sed的一些特殊命令如下:

sed ‘G‘ /etc/issue: 在文件中的每行后方添加空白行;
sed ‘$!d‘ /etc/fstab:保留最后一行;
sed ‘/^$/d;G‘ /etc/issue: 保证指定的文件每一行后方有且只有一个空白行;
sed ‘n;d‘ /etc/issue:保留奇数行;
sed -n ‘1!G;h;$p‘ /etc/issue
sed ‘$!N;$!D‘ /etc/issue

 

awk命令详解


什么是awk?awk是三个人名的缩写,他们是:Aho、(Peter)Weinberg和(Brain)Kernighan。awk是一个优秀的样式扫描与处理工具。awk提供了极其强大的功能:它几乎可以完成grep和sed所能完成的全部工作,同时,它还可以可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。它具备了一个完整的语言所应具有的几乎所有精美特性。awk 命令可以在命令行输入,也可以写在awk 脚本文件里。要处理的文本行则来自文件、管道或标准输入。

1.基本语法

awk [options] ‘program‘ file file ...

awk [options] ‘PATTERN{action}‘ file file ...

2.从文件输入

2.1下面演示/etc/passwd的文件,用awk打印出含有root的行

技术分享

2.2当打印文件/etc/passwd的某一行含有模式root时,打印改行的1.3两个字段

技术分享

3.从命令输入

可以将一条或多条linux命令的输出通过管道发给awk处理。格式如下:

技术分享

4.awk的变量:内置变量和自定义变量

4.1内置变量

  • FS:Field Seperator, 输入时的字段分隔符

  • RS:Record Seperator, 输入行分隔符

  • OFS: Output Field Seperator, 输出时的字段分隔符

  • ORS: Outpput Row Seperator, 输出时的行分隔符

  • NF:Numbers of Field,字段数

  • NR:Numbers of Record, 行数;所有文件的一并计数

  • FNR:行数;各文件分别计数

  • ARGV:数组,保存命令本身这个字符

  • ARGC: 保存awk命令中参数的个数

  • FILENAME: awk正在处理的当前文件的名称

4.2可自定义变量

  • -v var_name=VALUE

  • 可以program中定义变量;

  • 可以命令行中通过-v选项自定义变量;

  • 变量名区分字符大小写;

5.print函数

也可以用{print}形式在awk命令的动作部分显式地调用print函数。print函数的参数可以是变量、数值或字符串常量。字符串必须用双引号括起来。参数之间用逗号分隔,如果没有逗号,所有的参数就会被串在一起。默认情况下是空格逗号等价于OFS中的值.

例.利用date命令输出时间,通过awk截取年份和月份

技术分享

技术分享

6.printf函数

printf函数返回一个带格式的字符串给标准输出,如同C语言中的printf语句一样。printf语句包括一个加引号的控制串,控制串中可能嵌有若干格式说明和修饰符。控制串后面跟一个逗号,之后是一列由逗号分隔的表达式。printf函数根据控制串中的说明编排这些表达式的格式。与print函数不同的是, printf不会在行尾自动换行。因此,如果要换行,就必须在控制串中提供转义字符\n。

技术分享

下面通过一个实例来看

技术分享

对于echo命令的输出,Linux是经管道发给awk。printf函数包含一个控制串。百分号让printf做好准备,它要打印一个占15个格、向左对齐的字符串,这个字符串夹在两个竖杠之间,并且以换行符结尾。百分号后的短划线表示左对齐。

7.字段分隔符

输入字段分隔符awk的内存变量FS中保存了输入字段分隔符的值。使用FS的默认值时,awk用空格或制表符来分隔字段,并且删除各字段前多余的空格或制表符。

技术分享

虽然前面-F有指定分隔符:,但是后面通过赋值给变量OFS将其覆盖了。也就是说我们可以通过OFS这个变量来定义分隔符。












 

 

 

 

 

本文出自 “天才来自重复” 博客,请务必保留此出处http://laoli110.blog.51cto.com/9136611/1695390

linux sed,awk详解

标签:linux sed awk

原文地址:http://laoli110.blog.51cto.com/9136611/1695390

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!