uniq一般和sort一起使用,因为uniq命令要求输入数据必须经过排序
sort file1.txt file2.txt > sorted.txt sort file1.txt file2.txt -o sorted.txt # 按照数字顺序排列 sort -n file.txt # 按照逆序排序 sort -r file.txt # 按照月份排序(依照一月、二月、三月等) sort -M month.txt # 合并两个已排序过的文件 sort -m sorted1 sorted2 # 找出已排序文件中不重复的行 sort file1.txt file2.txt | uniq # 检查文件是否已经排序过 #!/bin/bash sort -C filename; if [$? -eq 0]; then echo Sorted; else echo Unsorted; fi # 如果文件已经排序,sort会返回为0的退出码($?),否则返回非0 # 依据键或列排序 $ cat data.txt 1 mac 2000 2 winxp 4000 3 bsd 1000 4 linux 1000 ## -k指定排序所依据得字符,如果是单个数字,则指的是列号,-r告诉sort命令按照逆序进行排序 ## 依据第1列,以逆序形式排序 $ sort -nrk 1 datat.txt 4 linux 1000 3 bsd 1000 2 winxp 4000 1 mac 2000 ## 依据第2列进行排序 $ sort -k 2 data.txt 3 bsd 1000 4 linux 1000 1 mac 2000 2 winxp 4000 ## -k后得整数制定了文本文件中得某一列。列与列之间由空格分隔,如果需要将特定范围内得一组字符(例如,第2列中得第4-5个字符)作为建,应该使用由点号分隔得两个整数来定义一个字符位置,然后将该范围内得第一个字符和最后一个字符用逗号连接起来 $ cat data.txt 1`alpha 300 2 beta 200 3 gamma 100 $ sort -bk 2.3,2.4 data.txt; # 按照m、p、t的顺序排序 3 gamma 100 1 alpha 300 2 beta 200 ## 用第一个字符作为键 $ sort -nk 1,1 data.txt # 为了使sort的输出与以 作为终止符的xargs命令相兼容,采用以下命令 $ sort -z data.txt | xargs -0 # 有时文本中可能会包含一些像空格之类的多余字符,如果需要忽略标点符号并以字典序排序,可以使用 $ sort -bd unsorted.txt ## 其中-b用来忽略文件中的签到空白行,选项-d用于指明以字典序进行排序uniq
uniq命令可以从给定输入中(stdin或命令行参数指定的文件)找出唯一的行,报告或删除那些重复的行
uniq只能用于排过序的数据,因此,uniq通常都与sort命令结合使用
$ cat sorted.txt bash foss hack hack # uniq生成唯一的行 $ uniq sorted.txt bash foss hack # 也可以这样 $ sort unsorted.txt|uniq # 只显示唯一的行(在输入文件中没有重复出现的行) $ uniq -u sorted.txt bash foss $ sort unsorted.txt|uniq -u # 统计各行在文件中出现的次数 $ sort unsorted.txt | uniq -c 1 bash 1 foss 2 hack # 找出文件中重复的行 $ sort unsorted.txt | uniq -d hack # 可以结合-s和-w选项来指定键 ## -s 指定跳过前N个字符 ## -w 指定用于比较的最大字符数 $ cat data.txt u:01:gnu d:04:linux u:01:bash u:01:hack $ sort data.txt | uniq -s 2 -w 2 d:04:linux u:01:bash ## -s 2 跳过前两个字符 ## -w 2 指定后续的两个字符 # -z选项可以生成由0值字节终止的输出 $ uniq -z file.txt $ uniq -z file.txt | xargs -0 rm临时文件命名与随机数
shell脚本经常需要存储临时数据,最适合存储临时数据的位置是/tmp(该目录中的内容在系统重启后会被清空)。有两种方法可以为临时数据生成标准的文件名
# 创建临时文件 $ filename=`mktemp` $ echo $filename /tmp/tmp.8xvhkjF5fH # 创建临时目录 $ dirname=`mktemp -d` $ echo $dirname tmp.NI8xzW7VRX # 仅仅只是想生成文件名,不希望创建实际的文件或目录 $ tmpfile=`mktemp -u` $ echo $tmpfile /tmp/tmp.RsGmilRpcT # 基于模板创建临时文件名 ## 注意模板中至少药有3个X $ mktemp test.XXX test.2tc



