linux wc,uniq,cut用法总结

时间:2023-01-30 22:24:21

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 1
wc:命令的功能为统计指定文件中的字节数、字数、行数,并将统计结果显示输出.

命令参数:

-c 统计字节数。

-l 统计行数。

-m 统计字符数。这个标志不能与 -c 标志一起使用。

-w 统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串。

-L 打印最长行的长度。

-help 显示帮助信息

--version 显示版本信息.


实例:

默认不带参数显示文件的 行数,字数,字节数:

-bash-4.1$ wc task.properties 
 12  11 467 task.properties


-l 显示文件的行数;-c 显示文件字节数;-w 显示文件字数:

-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


cut:是一个选取命令,就是将一段数据经过分析,取出我们想要的。一般来说,选取信息通常是针对“行”来进行分析的,并不是整篇信息分析的。

主要参数
-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


显示每个文件的文件所有者的权限(显示每行第2-4个字节):

-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只擅长处理“以一个字符间隔”的文本内容