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
原文地址:http://canshan.blog.51cto.com/2613522/1696411