您的位置:首页 > 运维架构 > Linux

linux sed awk

2015-09-19 23:17 633 查看
sed :

非交互式的流编辑器,通过多种转换修改流经他的文本,并将输出结果打印到屏幕上,但并不改变文件自身,可以做的编辑动作包括删除,查找,替换,插入,添加或者从其他文件中读取数据。

使用场景:
过于庞大的文本,有规律的文本修改,加快文件处理速度,常规修改困难的文本

语法:
sed [参数] 命令 目录

工作机制:
每次读取一行文本至“模式空间”中,在其中完成处理,并将处理 结果输出至标准输出设备

常用参数:
-r 支持扩展正则表达式语法

-n 使用安静模式,使用后只有经过sed特殊处理的那行才会被列出来

-e 直接在指令模式上进行动作编辑

-f 将sed 的动作写一个文档,-f filename 则可以执行filename内的sed 动作
-i 直接修改读取的档案内容,而不是由屏幕输出

命令:
[n1[,n2]] function

n1,n2 :不见得会存在,一般代表‘选择进行的行数’
命令选项:
a 新增,可以接字符串,而字符串会出现在新的下一行中

c 取代,可以接字符串,这些字符串可以取代n1,n2之间的行

d 删除

i 插入,后面接的字符串会在新的上一行出现
p 打印模式空间的行

P打印匹配的第一行
g 全局取代

s/old/new 用new替换正则表达式old --一般于g连用
= 显示行号

w /path/to/somefile:把指定的内容另存至/path/to/somefile路径所指定的文件中;
r /path/from/somefile:在文件的指定位置插入另一个文件的所有内容,完成文件合并;
[root@iZ28qzns9m4Z bashtest]# nl passwd |sed 's/user001/usernew001/g'



[root@iZ28qzns9m4Z bashtest]# nl 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
8	halt:x:7:0:halt:/sbin:/sbin/halt
[root@iZ28qzns9m4Z bashtest]# nl passwd |sed 'p'
1	root:x:0:0:root:/root:/bin/bash
1	root:x:0:0:root:/root:/bin/bash
2	bin:x:1:1:bin:/bin:/sbin/nologin
2	bin:x:1:1:bin:/bin:/sbin/nologin
3	daemon:x:2:2:daemon:/sbin:/sbin/nologin
3	daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@iZ28qzns9m4Z bashtest]# sed -i 's/\:/\#/g' passwd
[root@iZ28qzns9m4Z bashtest]# cat passwd
root#x#0#0#root#/root#/bin/bash
bin#x#1#1#bin#/bin#/sbin/nologin
daemon#x#2#2#daemon#/sbin#/sbin/nologin
adm#x#3#4#adm#/var/adm#/sbin/nologin
lp#x#4#7#lp#/var/spool/lpd#/sbin/nologin
sync#x#5#0#sync#/sbin#/bin/sync
shutdown#x#6#0#shutdown#/sbin#/sbin/shutdown
高级命令:

h:用模式空间中的内容覆盖保持空间的内容;

H:把模式空间中的内容追加至保持空间中内容的后面;

g:从保持空间中取到其内容,并将其覆盖模式空间中的内容;

G:从保持空间中取到其内容,并将其追加在模式空间中的内容的后面;

x:把保持空间和模式空间中的进行交换;

n:读取匹配到的行的下一行至模式空间;(会覆盖模式空间中的原有内容);

N:读取匹配到的行的下一行至模式空间,追加在模式空间中原有内容的后面;

d:删除模式空间中的内容;

D:删除多行模式空间中的首行;

注意:命令功能可使用!取反;分号可用于分隔脚本;

[root@iZ28qzns9m4Z bashtest]# sed 'G' passwd
root#x#0#0#root#/root#/bin/bash

bin#x#1#1#bin#/bin#/sbin/nologin

daemon#x#2#2#daemon#/sbin#/sbin/nologin
[root@iZ28qzns9m4Z bashtest]# nl passwd |sed 'n;d'
1	root#x#0#0#root#/root#/bin/bash
3	daemon#x#2#2#daemon#/sbin#/sbin/nologin
5	lp#x#4#7#lp#/var/spool/lpd#/sbin/nologin
7	shutdown#x#6#0#shutdown#/sbin#/sbin/shutdown
9	mail#x#8#12#mail#/var/spool/mail#/sbin/nologin
11	games#x#12#100#games#/usr/games#/sbin/nologin
13	nobody#x#99#99#Nobody#/#/sbin/nologin
常用正则表达式:
^ 匹配行开始

$ 匹配行的结束
. 匹配任意非换行字符
\(..\)保存匹配字符

x\{n\} 重复字符x,n次

x\{m,\} 重复字符x,至少m次
AWK:基于列的文本处理工具,他认为文件时有单词和空白字符组成
格式:
awk '条件类型1{动作1} 条件类型2{动作2}' filename
awk [options] 'program' file file ...
awk [options] 'PATTERN{action}' file file ...
要点:
(1) 各项目之间使用逗号分隔,而输出时则使用输出分隔符分隔;
(2)输出的各item可以字符串或数值、当前记录的字段、变量或awk的表达式;数值会被隐式转换为字符串后输出;
(3) print后面item如果省略,相当于print $0;输出空白,使用pirnt "";
运算符:
运算符 描述
= += -= *= /= %= ^= **= 赋值
?: C条件表达式
|| 逻辑或
&& 逻辑与
~ ~! 匹配正则表达式和不匹配正则表达式
< <= > >= != == 关系运算符
空格 连接
+ - 加,减
* / & 乘,除与求余
+ - ! 一元加,减和逻辑非
^ *** 求幂
++ -- 增加或减少,作为前缀或后缀
$ 字段引用
in 数组成员

环境变量:
变量 描述
$n 当前记录的第n个字段,字段间由FS分隔。
$0 完整的输入记录。
ARGC 命令行参数的数目。
ARGIND 命令行中当前文件的位置(从0开始算)。
ARGV 包含命令行参数的数组。
CONVFMT 数字转换格式(默认值为%.6g)
ENVIRON 环境变量关联数组。
ERRNO 最后一个系统错误的描述。
FIELDWIDTHS 字段宽度列表(用空格键分隔)。
FILENAME 当前文件名。
FNR 同NR,但相对于当前文件。
FS 字段分隔符(默认是任何空格)。
IGNORECASE 如果为真,则进行忽略大小写的匹配。
NF 当前记录中的字段数。
NR 当前记录数。
OFMT 数字的输出格式(默认值是%.6g)。
OFS 输出字段分隔符(默认值是一个空格)。
ORS 输出记录分隔符(默认值是一个换行符)。
RLENGTH 由match函数所匹配的字符串的长度。
RS 记录分隔符(默认是一个换行符)。
RSTART 由match函数所匹配的字符串的第一个位置。
SUBSEP 数组下标分隔符(默认值是/034)。
3、awk的printf命令
命令的使用格式:printf format, item1, item2,...

要点:

(1) 要指定format;
(2) 不会自动换行;如需换行则需要给出\n
(3) format用于为后面的每个item指定其输出格式;
format格式的指示符都%开头,后跟一个字符:

%c: 显示字符的ASCII码;
%d, %i: 十进制整数;
%e, %E: 科学计数法显示数值;
%f: 显示浮点数;
%g, %G: 以科学计数法格式或浮点数格式显示数值;
%s: 显示字符串;
%u: 显示无符号整数;
%%: 显示%自身;
修饰符:
#:显示宽度
-:左对齐
+:显示数值的符号
.#: 取值精度

4、awk输出重定向
print items > output-file
print items >> output-file
print items | command

特殊文件描述符:
/dev/stdin: 标准输入
/dev/stdout: 标准输出
/dev/stderr: 错误输出
awk的内置函数
split(string,array[,fieldsep[,seps]]):

功能:将string表示的字符串以fieldsep为分隔符进行切片,并切片后的结果保存至array为名的数组中;数组下标从1开始;
length(string)
功能:返回给定字串的长度
substr(string,start[,length])

功能:从string中取子串,从start为起始位置为取length长度的子串;
[root@iZ28qzns9m4Z bashtest]# last -n 5 |awk '{print $1 "\t" $3}'
root	211.161.27.115
root	61.182.229.120
root	61.182.229.120
root	180.91.225.119
root	180.91.225.119

wtmp	Tue
[root@iZ28qzns9m4Z bashtest]#
[root@iZ28qzns9m4Z bashtest]# awk '{print substr($1,6)}' passwd
x#0#0#root#/root#/bin/bash
#1#1#bin#/bin#/sbin/nologin
n#x#2#2#daemon#/sbin#/sbin/nologin
#3#4#adm#/var/adm#/sbin/nologin
[root@iZ28qzns9m4Z bashtest]# nl passwd |awk '{print length}'
38
39
46
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: