• 实用的分类(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
个字符开始。
举例:
按第一个域分类
-bash-3.00$ sort -k0 sed.txt
打印分类后的最后第一行
-bash-3.00$ sort -k0 sed.txt | tail -1
打印分类后的第一行
-bash-3.00$ sort -k0 sed.txt | head -1
awk使用sort输出结果
-bash-3.00$ sort -k0 sed.txt | head -1 | awk '{if($1=="caodejun")print $1}'
将两个分类文件合并
-bash-3.00$ sort -m sed.txt sort.txt
将文件合并前,它们必须已被分类。合并文件可用于事务处理和任何种类的修改操作。
下面这个例子,因为忘了把两个家电名称加入文件,它们被放在一个单独的文件里,现在将
之并入一个文件。分类的合并格式为‘sort -m sorted_file1 sorted_file2’。
删除重复行
-bash-3.00$ sort -u sed.txt
• uniq
uniq用来从一个文本文件中去除或禁止重复行。一般uniq假定文件已分类,并且结果正确。我们并不强制要求这样做,如果愿意,可以使用任何非排序文本,甚至是无规律行。
-bash-3.00$ who | awk '{print $1} ' |uniq
liuzk423
605408211
shuzigui
nefu_luyanshen
waterlooz
wsoangel
tomotoboy
xp55699312
zyy0904
caodejun
duke1988
605408211
nefu_luyanshen
zyy0904
lonelysand
显示不唯一的行
-bash-3.00$ who | awk '{print $1} ' |uniq -d
-c打印每一重复行出现次数。
-bash-3.00$ who | awk '{print $1} ' |uniq -c
1 liuzk423
1 605408211
1 shuzigui
1 nefu_luyanshen
1 waterlooz
1 wsoangel
1 tomotoboy
1 xp55699312
1 zyy0904
1 caodejun
1 duke1988
1 605408211
1 nefu_luyanshen
1 zyy0904
1 lonelysand
这里没有搞懂nefu_luyanshen明明重复,却显示重复行数目为1
对特定域进行测试,使用-n只测试一行一部分的唯一性。
-bash-3.00$ who | awk '{print $1} ' |uniq -n2
liuzk423
• join
将两个已经分好类的文件连接在一起哈。一些系统要求使用join时文件域要少于20,为公平起见,如果域大于20,应使用DBMS系统,其一般格式如下:
join [options] in_file1 in_file2
-bash-3.00$ cat sed.txt
605408211 pts/16 Jul 31 13:54 (218.0.1.42)
caodejun pts/44 Jul 31 14:16 (219.148.133.31)
duke1988 pts/45 Jul 31 14:41 (218.104.163.66)
liuzk423 pts/6 Jul 20 08:27 (219.245.104.240)
nefu_luyanshen pts/23 Jul 31 14:33 (218.25.6.142)
nefu_luyanshen pts/48 Jul 31 12:59 (218.25.6.142)
shuzigui pts/21 Jul 31 12:11 (121.35.248.193)
tomotoboy pts/41 Jul 31 13:31 (219.221.99.155)
waterlooz pts/25 Jul 31 08:48 (121.0.29.225)
wsoangel pts/35 Jul 31 13:40 (116.233.219.10)
xp55699312 pts/42 Jul 31 14:12 (61.152.132.103)
zyy0904 pts/43 Jul 31 13:53 (125.33.195.36)
-bash-3.00$ cat sort.txt
605408211 pts/16 Jul 31 13:54 (218.0.1.42)
caodejun pts/44 Jul 31 14:16 (219.148.133.31)
duke1988 pts/45 Jul 31 14:41 (218.104.163.66)
-bash-3.00$ join sed.txt sort.txt
605408211 pts/16 Jul 31 13:54 (218.0.1.42) pts/16 Jul 31 13:54 (218.0.1.42)
caodejun pts/44 Jul 31 14:16 (219.148.133.31) pts/44 Jul 31 14:16 (219.148.133.31)
duke1988 pts/45 Jul 31 14:41 (218.104.163.66) pts/45 Jul 31 14:41 (218.104.163.66)
选择匹配
-bash-3.00$ join -a1 -a2 sed.txt sort.txt
605408211 pts/16 Jul 31 13:54 (218.0.1.42) pts/16 Jul 31 13:54 (218.0.1.42)
caodejun pts/44 Jul 31 14:16 (219.148.133.31) pts/44 Jul 31 14:16 (219.148.133.31)
duke1988 pts/45 Jul 31 14:41 (218.104.163.66) pts/45 Jul 31 14:41 (218.104.163.66)
liuzk423 pts/6 Jul 20 08:27 (219.245.104.240)
nefu_luyanshen pts/23 Jul 31 14:33 (218.25.6.142)
nefu_luyanshen pts/48 Jul 31 12:59 (218.25.6.142)
shuzigui pts/21 Jul 31 12:11 (121.35.248.193)
tomotoboy pts/41 Jul 31 13:31 (219.221.99.155)
waterlooz pts/25 Jul 31 08:48 (121.0.29.225)
wsoangel pts/35 Jul 31 13:40 (116.233.219.10)
xp55699312 pts/42 Jul 31 14:12 (61.152.132.103)
zyy0904 pts/43 Jul 31 13:53 (125.33.195.36)
-bash-3.00$ join -o 1.1 2.2 sed.txt sort.txt
605408211 pts/16
caodejun pts/44
duke1988 pts/45
-bash-3.00$ join -o 1.1 2.2 2.3 sed.txt sort.txt
605408211 pts/16 Jul
caodejun pts/44 Jul
duke1988 pts/45 Jul
• 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域。
-bash-3.00$ ps -ef | cut -c1-8
-bash-3.00$ ps -ef | cut -d: -f1
-bash-3.00$ ps -ef | cut -d: -f1,3
• paste
cut用来从文本文件或标准输出中抽取数据列或者域,然后再用 paste可以将这些数据粘贴
起来形成相关文件。粘贴两个不同来源的数据时,首先需将其分类,并确保两个文件行数相
同。
paste将按行将不同文件行信息放在一行。缺省情况下, paste连接时,用空格或tab键分隔
新行中不同文本,除非指定- d选项,它将成为域分隔符。paste格式为:
paste -d -s -file1 file2
选项含义如下:
-d 指定不同于空格或t a b键的域分隔符。例如用@分隔域,使用- d @。
-s 将每个文件合并成行而不是按行粘贴。
- 使用标准输入。例如ls -l |paste ,意即只在一列上显示输出。
• split
split用来将大文件分割成小文件。有时文件越来越大,传送这些文件时,首先将其分割可
能更容易。使用v i或其他工具诸如sort时,如果文件对于工作缓冲区太大,也会存在一些问题。
因此有时没有选择余地,必须将文件分割成小的碎片。
split命令一般格式:
split -output_file-size input-filename output-filename
这里output_file-size 指的是文本文件被分割的行数。
-bash-3.00$ ps -ef |split -10
-bash-3.00$ ls
a.out greeting.sh main.c sort.txt xac xai xao
|
|
append.sed grepgrepstrings nohup.out test xad xaj xap
|
|
change.sed grepstr readme.sh test.sh xae xak xaq
|
|
core.log hello seawolf user.online xaf xal xar
|
|
factorial hello.cpp sed.out xaa xag xam
|
|
factorial.c main sed.txt xab xah xan |