1.sed是一款流编辑工具,用来对文本进行过滤与替换工作,特别是当你想要对几十个配置文件做统计修改时,你会感受到sed的魅力!
sed通过输入读取文件内容,但一次仅读取一行内容进行某些指令处理后输出,所以sed更适合于处理大数据文件。
.sed流程:
* 通过文件或管道读取文件内容。
* sed并不直接修改源文件,而是将读入的内容复制到缓冲区中,我们称之为模式空间(pattern space)。
* 根据sed的指令对模式空间中的内容进行处理并输出结果,默认输出至标准输出即屏幕上。
输入
------------------------------------------------
|
|
v
v
读取一行内容,并复制到模式空间 <------------ sed 指令
|
|
v
v
------------------------------------------------
输出经过处理后的内容
二、sed基本语法结构
sed Options... [script] [inputfile...]
sed 选项... [脚本指令] [输入文件]
如果没有输入文件,则sed默认对标准输入进行处理(即键盘输入)。脚本指令是第一个不以“-”开始的参数。
1.选项含义:
--version 显示sed版本。
--help 显示帮助文档。
-n,--quiet,--silent 静默输出,默认情况下,sed程序在所有的脚本指令执行完毕后,将自动打印模式空间中的内容,这些选项可以屏蔽自动打印。
-e script 允许多个脚本指令被执行。
-f script-file,
--file=script-file 从文件中读取脚本指令,对编写自动脚本程序来说很棒!
-i,--in-place 直接修改源文件,经过脚本指令处理后的内容将被输出至源文件(源文件被修改)慎用!
-l N, --line-length=N 该选项指定l指令可以输出的行长度,l指令用于输出非打印字符。
--posix 禁用GNU sed扩展功能。
-r, --regexp-extended 在脚本指令中使用扩展正则表达式
-s, --separate 默认情况下,sed将把命令行指定的多个文件名作为一个长的连续的输入流。GNU sed则允许把他们当作单独的文件, 这样如正则表达式则不进行跨文件匹配。
-u, --unbuffered 最低限度的缓存输入与输出。
grep "2014-05-29" gpdata.txt
grep "2014-05-*" gpdata.txt
grep "2014-05-*" gpdata.txt | wc -l
列出2014-06月所有上涨的数据
1)打印第一行
grep "2014-06-*" gpdata.txt | awk '{ if($7 > 0) print $1 }'
2)打印第1行和第7行
grep "2014-06-*" gpdata.txt | awk '{ if($7 > 0) print $1, "\t", $7 }'
3)统计共有多少条
grep "2014-06-*" gpdata.txt | awk '{ if($7 > 0) print $1, "\t", $7 }' |wc -l
4)打印符合条件的整行数据 $0
grep "2014-06-*" gpdata.txt | awk '{ if($7 > 0) print $0}'
$0代表整个文本行;
$1代表文本行中的第1个数据字段;
$2代表文本行中的第2个数据字段;
$n代表文本行中的第n个数据字段。
5 显示上海大盘2014-02月上涨幅度最大的一天
grep "2014-02-*" gpdata.txt | sort -n -k7
grep "2014-02-*" gpdata.txt | sort -n -k7|tail -1
grep "2014-02-*" gpdata.txt | sort -n -k7|tail -2
grep "2014-02-*" gpdata.txt | sort -n -k7|tail -3
grep "2014-02-*" gpdata.txt | sort -n -k7 -r
grep "2014-02-*" gpdata.txt | sort -n -k7 -r | head -1
grep "2014-02-*" gpdata.txt | sort -n -k7 -r | head -2
grep "2014-02-*" gpdata.txt | sort -n -k7 -r | head -3
显示上海大盘2014-02月份所有上涨数据的时间和上涨的幅度(%)
grep "2014-02-*" gpdata.txt | awk '{ if ($7 > 0) print $1,"\t\t\t\t" $7 }'
7 显示上海大盘2014-02月份所有上涨数据的时间和上涨的幅度(%),第5条-第10条之间的数据
grep "2014-02-*" gpdata.txt | awk '{ if ($7 > 0) print $1,"\t\t" $7 }' | sed -n "5,10p"
sed命令的常用用法
1、按照一个范围(第几行到第几行),提取数据
2、sed的主要用法是编辑功能,对提取的数据,进行修改、替换、删除、插入等操作
其中替换必须要会。。
8 列出上海大盘2014-02月份涨跌在1个点和2个点之间的数据
grep "2014-02-*" gpdata.txt | awk '{ if($7 > 0 && $7 < 2) print $1 }'
grep "2014-*" gpdata.txt | awk '{ if($7 > 0 && $7 < 2) print $1,"\t\t", $7 }'
find -name "*.sh" | xargs grep -n "case"
find -name "*.sh" | xargs grep -n "case" | awk -F":" '{ print $1, "\t\t", $2 }'
sed -n 'p' 2.txt
sed -n '3,/ddd/p' 2.txt
sed -n '/^$/=' 2.txt
显示hello所在的行
sed -n '/hello/=' 2.txt
sed 's/d/D/g' 2.txt
sed -i 's/^M//g' 3.txt>new.txt
文本处理常用技巧总结
find命令:按照文件名,在某一目录下,查找符合条件的目录或者文件
find -name "*.sh" ./
grep命令 对文本模式匹配,按照行方式
-v 取反 -n显示匹配行及行号 -c输出匹配计数
awk命令 对文本按照列进行处理或打印
sort命令 对文本按照行进行排序处理,默认从小到大
-n按照数字处理 -k7代表第7列 -r逆序
sed命令 按照行或者处理文本
sed -n '1p' -n按照行定为打印
sed -n '1,3p' 范围
sed -n '$p' 代表最后一行
sed 文本替换
ipcs | sed -n '/shared/='