uniq命令可以去除排序过的文件中的重复行,因此uniq经常和sort合用。也就是说,为了使uniq起作用,所有的重复行必须是相邻的。
实例:
现在有如下数据:
-bash-4.1$ ls -l | awk '{print $2}' 24 2 1 1 1 1 1
显示上面不重复的行:
-bash-4.1$ ls -l | awk '{print $2}'| uniq 24 2 1
对重复的行进行计数:
-bash-4.1$ ls -l | awk '{print $2}'| uniq -c 1 24 1 2 5 1
只显示有重复的行,并显示重复行的数量:
-bash-4.1$ ls -l | awk '{print $2}'| uniq -cd 5 1wc:命令的功能为统计指定文件中的字节数、字数、行数,并将统计结果显示输出.
命令参数:
-c 统计字节数。
-l 统计行数。
-m 统计字符数。这个标志不能与 -c 标志一起使用。
-w 统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串。
-L 打印最长行的长度。
-help 显示帮助信息
--version 显示版本信息.
实例:
默认不带参数显示文件的 行数,字数,字节数:
-bash-4.1$ wc task.properties 12 11 467 task.properties
-bash-4.1$ wc -l task.properties 12 task.properties -bash-4.1$ wc -c task.properties 467 task.properties -bash-4.1$ wc -w task.properties 11 task.properties
-bash-4.1$ ls -l total 24 drwxr-xr-x. 2 root root 4096 Nov 9 12:33 conf -rw-r--r--. 1 root root 1498 Nov 9 12:33 dubbo-consumer.xml -rw-r--r--. 1 root root 3008 Nov 9 12:33 logback.xml -rw-r--r--. 1 root root 567 Nov 9 12:33 root-bean.xml -rw-r--r--. 1 root root 2146 Nov 9 12:33 task-config.xml -rw-r--r--. 1 root root 467 Nov 9 12:33 task.properties
使用管道命令对上面命令返回的内容统计行数:
-bash-4.1$ ls -l |wc -l 7
主要参数
-b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
-c :以字符为单位进行分割。
-d :自定义分隔符,默认为制表符。
-f :与-d一起使用,指定显示哪个区域。
-n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的<br />范围之内,该字符将被写出;否则,该字符将被排除。
(2)cut一般以什么为依据呢? 也就是说,我怎么告诉cut我想定位到的剪切内容呢?
cut命令主要是接受三个定位方法:
第一,字节(bytes),用选项-b
第二,字符(characters),用选项-c
第三,域(fields),用选项-f
实例:
有如下信息:
-bash-4.1$ ls -l total 24 drwxr-xr-x. 2 root root 4096 Nov 9 12:33 conf -rw-r--r--. 1 root root 1498 Nov 9 12:33 dubbo-consumer.xml -rw-r--r--. 1 root root 3008 Nov 9 12:33 logback.xml -rw-r--r--. 1 root root 567 Nov 9 12:33 root-bean.xml -rw-r--r--. 1 root root 2146 Nov 9 12:33 task-config.xml -rw-r--r--. 1 root root 467 Nov 9 12:33 task.properties显示每个文件的文件所有者的写权限(显示每行第3个字节):
-bash-4.1$ ls -l | sed -n '2,7p' | cut -b 3 w w w w w w
-bash-4.1$ ls -l | sed -n '2,7p' | cut -b 2-4 rwx rw- rw- rw- rw- rw-
或:
-bash-4.1$ ls -l | sed -n '2,7p' | cut -b 2,3,4 rwx rw- rw- rw- rw- rw-
或:
-bash-4.1$ ls -l | sed -n '2,7p' | cut -b 2,3,4- rwxr-xr-x. 2 root root 4096 Nov 9 12:33 conf rw-r--r--. 1 root root 1498 Nov 9 12:33 dubbo-consumer.xml rw-r--r--. 1 root root 3008 Nov 9 12:33 logback.xml rw-r--r--. 1 root root 567 Nov 9 12:33 root-bean.xml rw-r--r--. 1 root root 2146 Nov 9 12:33 task-config.xml rw-r--r--. 1 root root 467 Nov 9 12:33 task.properties
-c参数:
[rocrocket@rocrocket programming]$ cat cut_ch.txt 星期一 星期二 星期三 星期四
[rocrocket@rocrocket programming]$ cut -c 3 cut_ch.txt 一 二 三 四
为什么会有“域”的提取呢,因为刚才提到的-b和-c只能在固定格式的文档中提取信息,而对于非固定格式的信息则束手无策。这时候“域”就派上用场了。如果你观察过/etc/passwd文件,你会发现,它并不像who的输出信息那样具有固定格式,而是比较零散的排放。但是,冒号在这个文件的每一行中都起到了非常重要的作用,冒号用来隔开每一个项。
我们很幸运,cut命令提供了这样的提取方式,具体的说就是设置“间隔符”,再设置“提取第几个域”,就OK了!
以/etc/passwd的前五行内容为例:
-bash-4.1$ cat /etc/passwd | head -n 5 root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin -bash-4.1$
-bash-4.1$ cat /etc/passwd | head -n 5 |cut -d ':' -f 1 root bin daemon adm lp
cut有哪些缺陷和不足:如果文件里面的某些域是由若干个空格来间隔的,那么用cut就有点麻烦了,因为cut只擅长处理“以一个字符间隔”的文本内容