linux的文本处理(学习笔记)
11合并与分割
s o r t命令的一般格式为:
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个字符开始。
例子:
基本sort
sort video.txt>results.out
sort分类求逆
sort -t: -r video.txt
按指定域分类
sort -t: +1 video.txt
数值域分类
sort -t: +3n video.txt
输出结果为:
Alien:HK:119:1982
Boys in Company C:HK:192:2192
The Hill:KL:63:2972
Toy Story:HK:239:3972
Star Wars:HK:301:4102
Aliens:HK:532:4892
A Few Good Men:KL:445:5851
s o r t还有另外一些方法指定分类键。可以指定k选项
sort -t: -r -k4 -k1 video.txt
注意:k选项是从1开始计数
开始以域0分类,忽略域2,然后再使用域3分类。
sort -t: +0 -2 +3 video.txt
pos用法
+ 1 . 2,意即以第1域最左边第3个字符开始分类,
sort -t: -r +1.2 video2.txt
使用head和tail将输出分类
显示最大的一行
sort -t: -r -k4 video.txt | head -1
显示倒数两行
sort -t: -r -k4 video.txt | tail -2
如果使用h e a d或t a i l时想省略显示行数,缺省时显示1 0行
sort -t: -r -k4 video.txt | tail -1 |awk -F: '{print "Worst rental",$1,"has been rented "$3""}'
系统sort
cat /etc/passwd | sort -t: +0 |awk -F":" '{print $1}'
uniq用法
u n i q用来从一个文本文件中去除或禁止重复行
命令一般格式:
uniq -u d c -f input-file output-file
-u 只显示不重复行。
-d 只显示有重复数据行,每种重复行只显示其中一行
-c 打印每一重复行出现次数。
-f n为数字,前n个域被忽略。一些系统不识别- f选项,这时替代使用- n
例子:
# cat myfile.txt
May Day
May Day
May Day
Going Down
May Day
# uniq myfile.txt
May Day
Going Down
May Day
# uniq -c myfile.txt
3 May Day
1 Going Down
1 May Day
使用- d显示重复出现的不唯一行:
# uniq -d myfile.txt
May Day
对特定域进行测试
使用- n只测试一行一部分的唯一性。
# cat parts.txt
AK123 OP
DK122 OP
EK999 OP
# uniq -f1 parts.txt
AK123 OP
# uniq -f0 parts.txt
AK123 OP
DK122 OP
EK999 OP
Join用法
- a 1显示第一个文件的不匹配行,- a 2为从第二个文件中显示不匹配行。
n.m n为文件号,m为域号。1 . 3表示只显示文件1第三域,每个n,m必须用逗号分隔,如1 . 3,2 . 1。
# cat name.txt
M.Golls 12 Hidd Rd
P.Heller The Acre
P.Willey 132 The Grove
T.Norms 84 Connaught Rd
K.Fletch 12 Woodlea
# cat town.txt
M.Golls Norwich NRD
P.Willey Galashiels GDD
T.Norms Brandon BSL
K.Fletch Mildenhall MAF
普通的JOIN
# join name.txt town.txt
M.Golls 12 Hidd Rd Norwich NRD
P.Willey 132 The Grove Galashiels GDD
T.Norms 84 Connaught Rd Brandon BSL
K.Fletch 12 Woodlea Mildenhall MAF
显示不匹配的行
# join -a1 -a2 name.txt town.txt
M.Golls 12 Hidd Rd Norwich NRD
P.Heller The Acre
P.Willey 132 The Grove Galashiels GDD
T.Norms 84 Connaught Rd Brandon BSL
K.Fletch 12 Woodlea Mildenhall MAF
以下显示相同结果
# join -a1 name.txt town.txt
M.Golls 12 Hidd Rd Norwich NRD
P.Heller The Acre
P.Willey 132 The Grove Galashiels GDD
T.Norms 84 Connaught Rd Brandon BSL
K.Fletch 12 Woodlea Mildenhall MAF
选择性连接
使用- o选项选择连接域
使用1 . 1显示第一个文件第一个域,2 . 2显示第二个文件第二个域,其间用逗号分隔。命令为:
# join -o 1.1,2.2 name.txt town.txt
M.Golls Norwich
P.Willey Galashiels
T.Norms Brandon
K.Fletch Mildenhall
使用-jn m进行其他域连接
例如用文件1域3和文件域2做连接键,命令为
# cat pers
P.Jones Office Runner ID897
S.Round UNIX admin ID666
L.Clip Personl Chief ID982
# cat pers2
Dept2C ID897 6 years
Dept3S ID666 2 years
Dept5Z ID982 1 years
# join -j1 4 -j2 2 pers pers2 无法显示,有疑问
应该是 join -1 4 -2 2 pers pers2
# join -1 4 -2 4 -o 1.1,1.2,1.3,2.1,2.2,2.3,2.4 jtxt1 jtxt2
Feb 22 14:53 Feb 22 14:57 /data/oracle/LNWASP1/data1/LNWASP1_QUEST_SMALL1_DATA_01.dbf
Feb 22 14:53 Feb 22 14:57 /data/oracle/LNWASP1/data1/LNWASP1_audits01.dbf
Feb 22 14:54 Feb 22 14:58 /data/oracle/LNWASP1/data1/LNWASP1_data01_01.dbf
Feb 22 14:54 Feb 22 14:58 /data/oracle/LNWASP1/data1/LNWASP1_index01_01.dbf
Feb 22 14:53 Feb 22 14:57 /data/oracle/LNWASP1/data1/LNWASP1_tools_01.dbf
Feb 22 14:53 Feb 22 14:57 /data/oracle/LNWASP1/data1/LNWASP1_users_01.dbf
Feb 22 14:53 Feb 22 14:57 /data/oracle/LNWASP1/index1/LNWASP1_sysaux02.dbf
Feb 22 14:53 Feb 22 14:57 /data/oracle/LNWASP1/index1/LNWASP1_sysaux03.dbf
Feb 22 14:54 Feb 22 14:58 /data/oracle/LNWASP1/redo1/LNWASP1_ctl_01.dbf
Feb 22 14:54 Feb 22 14:58 /data/oracle/LNWASP1/redo2/LNWASP1_ctl_02.dbf
Feb 22 14:54 Feb 22 14:58 /data/oracle/LNWASP1/redo3/LNWASP1_ctl_03.dbf
Feb 22 14:54 Feb 22 14:58 /data/oracle/LNWASP1/rollback/LNWASP1_undotbs01.dbf
Feb 22 14:53 Feb 22 14:57 /data/oracle/LNWASP1/system/LNWASP1_sysaux01.dbf
Feb 22 14:53 Feb 22 14:57 /data/oracle/LNWASP1/system/LNWASP1_system01.dbf
Feb 22 05:06 Feb 22 05:06 /data/oracle/LNWASP1/temp/LNWASP1_temp01.dbf
(/apps/oracle/scripts/ADHOC/DOBCPFILETSCHECK/tmp) (/apps/oracle/scripts/ADHOC/DOBCPFILETSCHECK/tmp)
c u t用法
用来从标准输入或文本文件中剪切列或域。剪切文本可以将之粘贴到一个文本文件。
c u t一般格式为:
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 -d: -f1,6 /etc/passwd
# ls -l|cut -c3-6
# who -u | cut -c1-8
p a s t e用法
格式为;
paste -d -s -file1 file2
选项含义如下:
-d 指定不同于空格或t a b键的域分隔符。例如用@分隔域,使用- d @。
-s 将每个文件合并成行而不是按行粘贴。
- 使用标准输入。例如ls -l |paste ,意即只在一列上显示输出。
# paste pers pers2
P.Jones Office Runner ID897 Dept2C ID897 6 years
S.Round UNIX admin ID666 Dept3S ID666 2 years
L.Clip Personl Chief ID982 Dept5Z ID982 1 years
# ls -l|paste –s 按照一行粘贴
# paste -s pers pers2
P.Jones Office Runner ID897 S.Round UNIX admin ID666 L.Clip Personl Chief ID982
Dept2C ID897 6 years Dept3S ID666 2 years Dept5Z ID982 1 years
p a s t e命令还有一个很有用的选项( -)。意即对每一个( -),从标准输入中读一次数据。
ls | paste -d" " - - - -
p l i t用法
命令一般格式:
split -output_file-size input-filename output-filename
这里o u t p u t - f i l e - s i z e指的是文本文件被分割的行数。s p l i t查看文件时,o u t p u t - f i l e - s i z e选项
指定将文件按每个最多1 0 0 0行分割。
tr 用法
t r用来从标准输入中通过替换或删除操作进行字符转换。t r主要用于删除文件中控制字符或进行字符转换。使用t r时要转换两个字符串:字符串1用于查询,字符串2用于处理各种转换。
带有最常用选项的t r命令格式为:
t r - c - d - s [ " s t r i n g 1 _ t o _ t r a n s l a t e _ f r o m " ] [ " s t r i n g 2 _ t o _ t rannsulta_t e _ t o " ] input-f i l e
这里:
-c 用字符串1中字符集的补集替换此字符集,要求字符集为A S C I I。
-d 删除字符串1中所有输入字符。
-s 删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串。
I n p u t - f i l e是转换文件名。虽然可以使用其他格式输入,但这种格式最常用。
使用t r时,可以指定字符串列表或范围作为形成字符串的模式。这看起来很像正则表达式,但实际上不是。指定字符串1或字符串2的内容时,只能使用单字符或字符串范围或列表。
[a-z] a-z内的字符组成的字符串。
[A-Z] A-Z内的字符组成的字符串。
[0-9] 数字串。
/octal 一个三位的八进制数,对应有效的A S C I I字符。
[O*n] 表示字符O重复出现指定次数n。因此[ O * 2 ]匹配O O的字符串。
# cat oops.txt
And the cowwwwwwwwwwwwws went homeeeeeeeeeeeee
Or did theyyyyyyyy
# tr -s "[a-z]"<oops.txt
And the cows went home
Or did they
如果是替换单字符,不需要引号
# tr -s w<oops.txt
And the cows went homeeeeeeeeeeeee
Or did theyyyyyyyy
# cat oops.txt | tr -s "[a-z]"
And the cows went home
Or did they
删除空行
以下格式都可以:
tr -s "["012]" < plane.txt
tr -s "["n]" < plane.txt
tr -s ['"n'] < plane.txt
tr -s '["n]' < plane.txt
转换大小写
tr "[a-z]" "[A-Z]" <quote.txt 小写全部变大写
tr "[a-z]" "[A-Z]" <quote.txt|tee quote4.txt quote5.txt
cat quote.txt |tr "[:lower:]" "[:upper:]"
删除指定字符
# cat jtxt1|tr -cs "[a-z][A-Z]" "["012*]"
去除通过ftp上传的文件的控制符号
用t a b键替换^ ^ ^ ^ ^ ^,命令为" " 1 3 6 " " [ " 0 11 * ] "。将结果重定向到临时工作文件s t a t . t m p。
# tr -s "["136]" "["011*]" <stat.tr > stat.tmp
用新行替换每行末尾的^ M,并用" n去除^ Z,输入要来自于临时工作文件s t a t . t m p
# tr -s "["015"032]" ""n" < stat.tmp
替换p a s s w d文件中所有冒号,代之以t a b键
# tr -s "[:]" "["011]" </etc/passwd
匹配多于一个字符
用星号代替所有的0。模式为[ 0 * 4 ],意即匹配至少4个0,替换字符串为星号
tr "[0*4]" "*" < hdisk.txt
李世侠,网名caibird2005 , initdba , 战神
MySQL DBA经验6年;
Oracle DBA经验10年;
精通MySQL HA架构,复制,备份,恢复,SQL优化;
熟悉SHELL编程、Python编程、SQL&PL/SQL编程;
MySQL OCP课程讲师;
ORACLE官方认证OCM证书;
BLOG: http://www.cnblogs.com/caibird2005
http://www.initdba.cn
Wechat: caibird2005
TEL :+86-186-5881-5300 +86-180-7290-8651