11月5日
linux学习--sed,sort,uniq,join,cut,paste,split
==============================sed==========================
1、调用sed
调用s e d有三种方式:在命令行键入命令;将s e d命令插入脚本文件,然后调用s e d;将s e d
命令插入脚本文件,并使s e d脚本可执行。
使用s e d命令行格式为:
sed [选项] s e d命令 输入文件。
记住在命令行使用s e d命令时,实际命令要加单引号。s e d也允许加双引号
使用s e d脚本文件,格式为:
sed [选项] -f sed脚本文件输入文件
要使用第一行具有s e d命令解释器的s e d脚本文件,其格式为
sed脚本文件 [选项] 输入文件
sed选项如下:
n 不打印;s e d不写编辑行到标准输出,缺省为打印所有行(编辑和未编辑)。p命令可以
用来打印编辑行。
c 下一命令是编辑命令。使用多项编辑时加入此选项。如果只用到一条s e d命令,
此选项无用,但指定它也没有关系。
f 如果正在调用s e d脚本文件,使用此选项。此选项通知s e d一个脚本文件支持所有的s e d
命令,例如:sed -f myscript.sed input_file,这里m y s c r i p t . s e d即为支持s e d命令的文件。
2、使用sed在文件中查询文本的方式
s e d浏览输入文件时,缺省从第一行开始,有两种方式定位文本:
1) 使用行号,可以是一个简单数字,或是一个行号范围。
2) 使用正则表达式
使用s e d在文件中定位文本的方式
x x为一行号,如1
x , y 表示行号范围从x到y,如2,5表示从第2行到第5行
/ p a t t e r n / 查询包含模式的行。例如/ d i s k /或/[a-z]/
/ p a t t e r n / p a t t e r n / 查询包含两个模式的行。例如/ d i s k / d i s k s /
p a t t e r n / , x 在给定行号上查询包含模式的行。如/ r i b b o n / , 3
x , / p a t t e r n / 通过行号和模式查询匹配行。3 . / v d u /
x , y ! 查询不包含指定行号x和y的行。1 , 2 !
3、基本sed编辑命令
sed编辑命令
p 打印匹配行
= 显示文件行号
a \ 在定位行号后附加新文本信息
i \ 在定位行号后插入新文本信息
d 删除定位行
c \ 用新文本替换定位文本
s 使用替换模式替换相应模式
r 从另一个文件中读文本
w 写文本到一个文件
q 第一个模式匹配完成后推出或立即推出
l 显示与八进制A S C I I代码等价的控制字符
{ } 在定位行执行的命令组
n 从另一个文件中读文本下一行,并附加在下一行
g 将模式2粘贴到/pattern n/
y 传送字符
n 延续到下一输入行;允许跨行的
4、sed和正则表达式
sed识别任何基本正则表达式和模式及其行匹配规则
5、基本sed编程举例
使用p(rint)显示行:
p r i n t命令格式为[ a d d r e s s [,a d d r e s s ] P。显示文本行必须提供s e d命令行号。
sed -n '2p' quote.txt
显示从2到4行
sed -n '2,4p' url_access_detail.txt
打印模式:
sed -n '/1028f/p' url_access_detail.txt
sed -n '/\/\?1028f/p' url_access_detail.txt
使用模式和行号进行查询:
只在第4行查询
sed -n '4,/\/\?1028f/'p url_access_detail.txt
显示整个文件:
只需将行范围设为第一行到最后一行1 , $。$意为最后一行:
sed -n '1,$p' quote.txt
任意字符:
匹配任意字母,后跟任意字母的0次或多次重复,并以i n g结尾,模式为/ . * i n g /。可以使用
这个模式查询以i n g结尾的任意单词
sed -n '/.*ing/'p quote.txt
打印行号:
要打印行号,使用等号=。打印模式匹配的行号,使用格式/pattern/=。
sed -e '/music/=' quote.txt
(不过这些好像在linux里面不支持)
附加文本:
sed -n '/1028f/'p url_access_detail.txt |sed '/h/ a\then haha'
在前面添加,用i\
替换,用c\
删除,用d\
6、替换文本
替换命令用替换模式替换指定模式,格式为:
[ a d d r e s s [,address]] s/ pattern-to-find /replacement-pattern/[g p w n]
s选项通知s e d这是一个替换操作,并查询p a t t e r n - t o - f i n d,成功后用r e p l a c e m e n t - p a t t e r n替
换它。
g 缺省情况下只替换第一次出现模式,使用g选项替换全局所有出现模式。
p 缺省s e d将所有被替换行写入标准输出,加p选项将使- n选项无效。- n选项不打印输出
结果。
w 文件名使用此选项将输出定向到一个文件。
sed 's/haha/hehe/g w a.out' quote.txt
使用替换修改字符串:
如果要附加或修改一个字符串,可以使用( &)命令,&命令保存发现模式以便重新调用
它,然后把它放在替换字符串里面。这里给出一个修改的设计思路。先给出一个被替换模式,
然后是一个准备附加在第一个模式后的另一个模式,并且后面带有&,这样修改模式将放在
匹配模式之前。例如, s e d语句s/nurse/"Hello"&/p 的结果如下
sed 's/nurse/"Hello" &/p' quote.txt
比如原来的句子为: The nurse come from china.
替换后的句子为: The "Hello" nurse come from china.
7、从文件中读文本
处理文件时, s e d允许从另一个文件中读文本,并将其文本附加在当前文件。此命令放在
模式匹配行后,格式为:address r filename
sed '/companty/r append.txt' quote.txt
8、显示文件中的控制字符
s e d格式为:
[ a d d r e s s,[ a d d r e s s ] ] l
sed '1,$1' quote.txt
(linux 不支持)
9、处理报文输出
比如有如下输出:
Database Size DateCreated
----------------------------
newlog 2289 12/11/2005
mysql 1909 09/12/2005
(2 row affected)
为了使用上述输出信息做进一步自动处理,需要知道所存数据库名称,为此需执行以下操作:
1) 使用s / - * / / g删除横线- - - - - -。
2) 使用/ ^ $ / d删除空行。
3) 使用$ d删除最后一行
4) 使用1 d删除第一行。
5) 使用awk {print $1}打印第一列。
命令如下,这里使用了c a t,并管道传送结果到s e d命令
最后的命令如下:
cat sql.txt| sed 's/-*//g'|sed '/^$//g'|sed '$d'|sed '1d'|awk '{print $1}'
去除行首数字:
sed 's/^[0-9]//g' data.txt
10、一些常用的处理
‘s / \ . $ / / g’ 删除以句点结尾行
‘-e /abcd/d’ 删除包含a b c d的行
‘s / [ ] [ ] [ ] * / [ ] / g’ 删除一个以上空格,用一个空格代替
‘s / ^ [ ] [ ] * / / g’ 删除行首空格
‘s / \ . [ ] [ ] * / [ ] / g’ 删除句点后跟两个或更多空格,代之以一个空格
‘/ ^ $ / d’ 删除空行
‘s / ^ . / / g’ 删除第一个字符
‘s /CO L \ ( . . . \ ) / / g’ 删除紧跟C O L的后三个字母
‘s / ^ \ / / / g’ 从路径中删除第一个\
‘s / [ ] / [ ] / / g’ 删除所有空格并用t a b键替代
‘S / ^ [ ] / / g’ 删除行首所有t a b键
‘s / [ ] * / / g’ 删除所有t a b键
================================合并与分割==========================
sort uniq join cut paste split
================sort用法=====================
sort命令将许多不同的域按不同的列顺序分类。
1、sort选项
sort命令的一般格式为:
sort -cmu -o output_file [other options] +pos1 +pos2 input_files
下面简要介绍一下s o r t的参数:
-c 测试文件是否已经分类。
-m 合并两个分类文件。
-u 删除所有复制行。
-o 存储s o r t结果的输出文件名。
其他选项有:
-b 使用域进行分类时,忽略第一个空格。
-n 指定分类是域上的数字分类。
-t 域分隔符;用非空格或t a b键分隔域。
-r 对分类次序或比较求逆。
+n n为域号。使用此域号开始分类。
n n为域号。在分类比较时忽略此域,一般与+ n一起使用。
post1 传递到m,n。m为域号,n为开始分类字符数;例如4,6意即以第5域分类,从第7个字符开始。
2、sort启动方式
缺省情况下, s o r t认为一个空格或一系列空格为分隔符。要加入其他方式分隔,使用- t选项。
sort执行时,先查看是否为域分隔设置了- t选项,如果设置了,则使用它来将记录分隔成域0、域1等等;
如果未设置,用空格代替。缺省时s o r t将整个行排序,指定域号的情况例外。
关于s o r t的一个重要事实是它参照第一个域作为域0,域1是第二个域,等等。
3、文件是否已分类
sort -c data.txt
4、sort分类求逆
如果要逆向s o r t结果,使用-r选项。
sort -t: -r video.txt
5、按指定域分类
有时需要只按第2域(分类键1)分类。
sort -t: +1 video.txt
6、数值域分类
用-n选项。必须用,不然得不到想要的结果。
sort -t: +3n video.txt
7、唯一性分类
使用- u选项进行唯一性(不重复)分类以去除重复行。
8、使用k的其他sort方法
sort还有另外一些方法指定分类键。可以指定k选项。
sort -t: -k4 video.txt
使用k做分类键排序:
可以指定分类键次序。先以第4域,再以第1域分类,命令为-k4 -k1
sort -t: -k4 -k1 video.txt
9、指定sort序列
可以指定分类键顺序,也可以使用- n选项指定不使用哪个分类键进行查询。看下面的sort命令:
sort +0 -2 +3
该命令意即开始以域0分类,忽略域2,然后再使用域3分类。
10、pos用法
指定开始分类的域位置的另一种方法是使用如下格式:
sort +filed.characterin
意即从filed开始分类,但是要在此域的第characterin个字符开始。
11、使用head和tail将输出分类
可以使用h e a d或t a i l查阅任何大的文本文件
head -200 filename
12、awk使用sort输出结果
13、将两个分类文件合并
将文件合并前,它们必须已被分类.
使用-m +0。将这个文件并入已存在的分类文件v i d e o . s o r t,要以名称域进行分类,实际上没有必要加入+ o,但为了保险起见,还是加上的好。
sort -t: -m +0 video2.txt video.sort
===================uniq用法====================
uniq用来从一个文本文件中去除或禁止重复行。一般u n i q假定文件已分类,并且结果正确。
sort的唯一性选项去除所有重复行,而uniq命令并不这样做。重复行是什么?在uniq里意即持续不断重复出现的行,中间不夹杂任何其他文本.
命令一般格式:
uniq -u d c -f inputfile outputfile
其选项含义:
-u 只显示不重复行。
-d 只显示有重复数据行,每种重复行只显示其中一行
-c 打印每一重复行出现次数。
-f n为数字,前n个域被忽略。
一些系统不识别- f选项,这时替代使用- n。
对特定域进行测试:
使用- n只测试一行一部分的唯一性。例如- 5意即测试第5域后各域唯一性。域从1开始记数。
如果忽略第1域,只测试第2域唯一性,使用- n 2,下述文件包含一组数据,其中第2域代表组代码。
uniq -f2 parts.txt或
uniq -n2 parts.txt
==================join用法(强大呀,像sql里面的join 呢)========================
join用来将来自两个分类文本文件的行连在一起。
下面讲述join工作方式。这里有两个文件f i l e 1和f i l e 2,当然已经分类。每个文件里都有一
些元素与另一个文件相关。由于这种关系, join将两个文件连在一起,这有点像修改一个主文
件,使之包含两个文件里的共同元素。
为有效使用join,需分别将输入文件分类:
join的格式:
join [option] file1,file2
an n 为一数字,用于连接时从文件n中显示不匹配行。例如, -a1显示第一个文件的不匹
配行,- a2为从第二个文件中显示不匹配行。
o n.m n为文件号,m为域号。1.3表示只显示文件1第三域,每个n,m必须用逗号分隔,
如1.3,2.1。
j n m n为文件号,m为域号。使用其他域做连接域
t 域分隔符。用来设置非空格或t a b键的域分隔符。例如,指定冒号做域分隔符- t:
连接域为域0,缺省join删除或去除连接键的第二次重复出现:
join names.txt town.txt
1、不匹配连接,下面的例子显示匹配及不匹配域
join -a1 -a2 names.txt town.txt
只显示第一个文件中不匹配行:
join -a1 names.txt town.txt
2、选择性连接
使用- o选项选择连接域。例如要创建一个文件仅包含人名及城镇, j o i n执行时需要指定显示域。方式如下:
使用1 . 1显示第一个文件第一个域,2 . 2显示第二个文件第二个域,其间用逗号分隔。命令为:
join -o 1.1,2.2 names.txt town.txt
使用-jn m进行其他域连接,例如用文件1域3和文件2域2做连接键,命令为:
join -j1 3 -j2 2 names.txt town.txt
===========================cut用法=========================================
cut用来从标准输入或文本文件中剪切列或域。剪切文本可以将之粘贴到一个文本文件。
cut一般格式为:
cut [options] file1 file2
下面介绍其可用选项:
-c list 指定剪切字符数。
-f field 指定剪切域数。
-d 指定与空格和t a b键不同的域分隔符。
-c 用来指定剪切范围,如下所示:
-c 1,5-7 剪切第1个字符,然后是第5到第7个字符。
-c1-50 剪切前5 0个字符。
-f 格式与- c相同。
-f 1,5 剪切第1域,第5域。
- f 1,10-12 剪切第1域,第1 0域到第1 2域。
剪切指定域:
cut命令中剪切各域需用逗号分隔,如剪切域1和3,可以使用:
cut -d: -f1,3 pers
=========================paste用法==========================================
cut用来从文本文件或标准输出中抽取数据列或者域,然后再用paste可以将这些数据粘贴
起来形成相关文件。粘贴两个不同来源的数据时,首先需将其分类,并确保两个文件行数相同。
paste将按行将不同文件行信息放在一行。缺省情况下,paste连接时,用空格或t a b键分隔
新行中不同文本,除非指定- d选项,它将成为域分隔符。
paste格式为;
paste -d -s -file1 file2
选项含义如下:
-d 指定不同于空格或t a b键的域分隔符。例如用@分隔域,使用- d @。
-s 将每个文件合并成行而不是按行粘
paste命令管道输入:
paste命令还有一个很有用的选项( -)。意即对每一个( -),从标准输入中读一次数据。
使用空格作域分隔符,以一个4列格式显示目录列表。方法如下:
ls |paste -d":" - - - -
=========================split用法==========================================
split用来将大文件分割成小文件。
split -output_file-size input-filename output-filename
每个文件格式为x [ a a ]到x [ z z ],x为文件名首字母, [ a a ]、[ z z ]为文件名剩余部分顺序字符组合.
split -5000 url_access_user.txt splitfile
阅读(5011) | 评论(2) | 转发(0) |