linux下find命令、Xargs 命令、uniq 命令、sort命令、tail命令、head命令的用法总结

每一种操作系统都有成千上万的文件组成,对于linux这样“一切皆文件”的操作系统来说更不例外,大家应该都能很轻松使用windows下的文件查找功能,但是对linux这一功能可能并不是很熟悉,其实想玩linux的你更要牢牢掌握这个命令,因为linux不像windows那样有固定的文件名后缀,并且因为linux阵营下百家争鸣的特性,一个相同的文件在不同的发行版,可能会有不同,所以如果你能牢牢掌握find命令的使用,你在摸索linux的道路上将会顺利很多,同时你会发现linux下文件查找功能其实很简单,而且要比windows下查找功能强大很多很多!好,下面进入正题

Linux下查找文件的命令有两个;locate 和 find

首先说下locate,locate这个命令是对其生成的数据库进行遍历(生成数据库的命令:updatedb),这一特性决定了用locate查找文件速度很快,但是locate命令只能对文件进行模糊匹配,在精确度上来说差了点,简单介绍下它的两个选项:

#locate

-i //查找文件的时候不区分大小写 比如:locate –i passwd

-n //只显示查找结果的前N行 比如:locate -n 5 passwd

下面重点说下find,find在不指定查找目录的情况下是对整个系统进行遍历查找

使用格式 : find [指定查找目录] [查找规则] [查找完后执行的action]

[指定查找目录]例如:

img

这里要注意的是目录之间要用空格分开

[查找规则]

(1)根据文件名查找

//根据文件名查找(精确查找)

# -iname //根据文件名查找,但是不区分大小写

这里另外介绍下文件名通配的知识

*表示 通配任意的字符

img ?表示 通配任意的单个字符img [ ] 表示 通配括号里面的任意一个字符img

(2),根据文件所属用户和组来查找文件 # -user //根据属主来查找文件 # -group //根据属组来查找文件

(3),根据uid 和 gid来查找用户 #find /tmp -uid 500 //查找uid是500 的文件 #find /tmp -gid 1000 // 查找gid是1000的文件

(4),-a and -o and –not的使用 # -a 连接两个不同的条件(两个条件必须同时满足)img 

img

# -o 连接两个不同的条件(两个条件满足其一即可) # -not 对条件取反的

(5),根据文件时间戳的相关属性来查找文件 我们可以使用stat命令来查看一个文件的时间信息 如下: img

#-atime #-mtime #-ctime #-amin #-mmin #-cmin

所以这里atime,mtime,ctime就是分别对应的“最近一次访问时间”“最近一次内容修改时间”“最近一次属性修改时间”,这里的atime的单位指的是“天”,amin的单位是分钟

#find /tmp –atime +5 //表示查找在五天内没有访问过的文件

#find /tmp -atime -5 //表示查找在五天内访问过的文件

(6),根据文件类型来查找文件 -type  f // 普通文件 d //目录文件 l //链接文件 b //块设备文件 c //字符设备文件 p //管道文件 s //socket文件

img

7),根据大小来查找文件 -size #find /tmp -size 2M //查找在/tmp 目录下等于2M的文件 #find /tmp -size +2M //查找在/tmp 目录下大于2M的文件 #find /tmp -size -2M //查找在/tmp 目录下小于2M的文件。find / -size +50M -exec ls -lh {} \;文件大于+50M,-50小于

8),根据文件权限查找文件 -perm #find /tmp -perm 755 //查找在/tmp目录下权限是755的文件 #find /tmp -perm +222 //表示只要有一类用户(属主,属组,其他)的匹配写权限就行 #find /tmp -perm -222 //表示必须所有类别用户都满足有写权限

(9),-nouser and -nogroup #find / -nogroup –a –nouser //在整个系统中查找既没有属主又没有属组的文件(这样的文件通常是很危险的,作为系统工程师的我们应该及时清除掉) [查找完执行的action]

# -print //默认情况下的动作 # -ls //查找到后用ls 显示出来 # -ok [commend] //查找后执行命令的时候询问用户是否要执行

img

# -exec [commend] //查找后执行命令的时候不询问用户,直接执行

img

这里要注意{}的使用:替代查找到的文件  #find /tmp -atime +30 –exec rm –rf {} \;

img

#删除查找到的超过30天没有访问过文件 我们也可以使用xargs来对查找到的文件进一步操作

Linux xargs 命令

Linux 命令大全 Linux 命令大全

xargs(英文全拼: eXtended ARGuments)是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。

xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。

xargs 也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。

xargs 默认的命令是 echo,这意味着通过管道传递给 xargs 的输入将会包含换行和空白,不过通过 xargs 的处理,换行和空白将被空格取代。

xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令。

之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了 xargs 命令,例如:

find /sbin -perm +700 |ls -l       #这个命令是错误的
find /sbin -perm +700 |xargs ls -l   #这样才是正确的

xargs 一般是和管道一起使用。

命令格式:

somecommand |xargs -item  command

参数:

  • -a file 从文件中读入作为 stdin
  • -e flag ,注意有的时候可能会是-E,flag必须是一个以空格分隔的标志,当xargs分析到含有flag这个标志的时候就停止。
  • -p 当每次执行一个argument的时候询问一次用户。
  • -n num 后面加次数,表示命令在执行的时候一次用的argument的个数,默认是用所有的。
  • -t 表示先打印命令,然后再执行。
  • -i 或者是-I,这得看linux支持了,将xargs的每项名称,一般是一行一行赋值给 {},可以用 {} 代替。
  • -r no-run-if-empty 当xargs的输入为空的时候则停止xargs,不用再去执行了。
  • -s num 命令行的最大字符数,指的是 xargs 后面那个命令的最大命令行字符数。
  • -L num 从标准输入一次读取 num 行送给 command 命令。
  • -l 同 -L。
  • -d delim 分隔符,默认的xargs分隔符是回车,argument的分隔符是空格,这里修改的是xargs的分隔符。
  • -x exit的意思,主要是配合-s使用。。
  • -P 修改最大的进程数,默认是1,为0时候为as many as it can ,这个例子我没有想到,应该平时都用不到的吧。

实例

xargs 用作替换工具,读取输入数据重新格式化后输出。

定义一个测试文件,内有多行文本数据:

# cat test.txt

a b c d e f g
h i j k l m n
o p q
r s t
u v w x y z

多行输入单行输出:

# cat test.txt | xargs
a b c d e f g h i j k l m n o p q r s t u v w x y z

-n 选项多行输出:

# cat test.txt | xargs -n3

a b c
d e f
g h i
j k l
m n o
p q r
s t u
v w x
y z

-d 选项可以自定义一个定界符:

# echo "nameXnameXnameXname" | xargs -dX

name name name name

结合 -n 选项使用:

# echo "nameXnameXnameXname" | xargs -dX -n2

name name
name name

读取 stdin,将格式化后的参数传递给命令

假设一个命令为 sk.sh 和一个保存参数的文件 arg.txt:

#!/bin/bash
#sk.sh命令内容,打印出所有参数。

echo $*

arg.txt文件内容:

# cat arg.txt

aaa
bbb
ccc

xargs 的一个选项 -I,使用 -I 指定一个替换字符串 {},这个字符串在 xargs 扩展时会被替换掉,当 -I 与 xargs 结合使用,每一个参数命令都会被执行一次:

# cat arg.txt | xargs -I {} ./sk.sh -p {} -l

-p aaa -l
-p bbb -l
-p ccc -l

复制所有图片文件到 /data/images 目录下:

ls *.jpg | xargs -n1 -I {} cp {} /data/images

xargs 结合 find 使用

用 rm 删除太多的文件时候,可能得到一个错误信息:/bin/rm Argument list too long. 用 xargs 去避免这个问题:

find . -type f -name "*.log" -print0 | xargs -0 rm -f

xargs -0 将 \0 作为定界符。

统计一个源代码目录中所有 php 文件的行数:

find . -type f -name "*.php" -print0 | xargs -0 wc -l

查找所有的 jpg 文件,并且压缩它们:

find . -type f -name "*.jpg" -print | xargs tar -czvf images.tar.gz

xargs 其他应用

假如你有一个文件包含了很多你希望下载的 URL,你能够使用 xargs下载所有链接:

# cat url-list.txt | xargs wget -c

Linux uniq 命令

Linux 命令大全 Linux 命令大全

Linux uniq 命令用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用。

uniq 可检查文本文件中重复出现的行列。

语法

uniq [-cdu][-f<栏位>][-s<字符位置>][-w<字符位置>][--help][--version][输入文件][输出文件]

参数

  • c或–count 在每列旁边显示该行重复出现的次数。
  • -d或–repeated 仅显示重复出现的行列。
  • -f<栏位>或–skip-fields=<栏位> 忽略比较指定的栏位。
  • -s<字符位置>或–skip-chars=<字符位置> 忽略比较指定的字符。
  • -u或–unique 仅显示出一次的行列。
  • -w<字符位置>或–check-chars=<字符位置> 指定要比较的字符。
  • –help 显示帮助。
  • –version 显示版本信息。
  • [输入文件] 指定已排序好的文本文件。如果不指定此项,则从标准读取数据;
  • [输出文件] 指定输出的文件。如果不指定此选项,则将内容显示到标准输出设备(显示终端)。

实例

文件testfile中第 2、3、5、6、7、9行为相同的行,使用 uniq 命令删除重复的行,可使用以下命令:

uniq testfile 

testfile中的原有内容为:

$ cat testfile      #原有内容  
test 30  
test 30  
test 30  
Hello 95  
Hello 95  
Hello 95  
Hello 95  
Linux 85  
Linux 85

使用uniq 命令删除重复的行后,有如下输出结果:

$ uniq testfile     #删除重复行后的内容  
test 30  
Hello 95  
Linux 85

检查文件并删除文件中重复出现的行,并在行首显示该行重复出现的次数。使用如下命令:

uniq -c testfile 

结果输出如下:

$ uniq -c testfile      #删除重复行后的内容  
3 test 30             #前面的数字的意义为该行共出现了3次  
4 Hello 95            #前面的数字的意义为该行共出现了4次  
2 Linux 85            #前面的数字的意义为该行共出现了2次 
当重复的行并不相邻时,uniq 命令是不起作用的,即若文件内容为以下时,uniq 命令不起作用:
$ cat testfile1      # 原有内容 
test 30  
Hello 95  
Linux 85 
test 30  
Hello 95  
Linux 85 
test 30  
Hello 95  
Linux 85

这时我们就可以使用 sort:

$ sort  testfile1 | uniq
Hello 95  
Linux 85 
test 30

统计各行在文件中出现的次数:

$ sort testfile1 | uniq -c
   3 Hello 95  
   3 Linux 85 
   3 test 30

在文件中找出重复的行:

$ sort testfile1 | uniq -d
Hello 95  
Linux 85 
test 30

Linux sort 命令

Linux 命令大全 Linux 命令大全

Linux sort 命令用于将文本文件内容加以排序。

sort 可针对文本文件的内容,以行为单位来排序。

语法

sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符>][+<起始栏位>-<结束栏位>][--help][--verison][文件][-k field1[,field2]]

参数说明

  • -b 忽略每行前面开始出的空格字符。
  • -c 检查文件是否已经按照顺序排序。
  • -d 排序时,处理英文字母、数字及空格字符外,忽略其他的字符。
  • -f 排序时,将小写字母视为大写字母。
  • -i 排序时,除了040至176之间的ASCII字符外,忽略其他的字符。
  • -m 将几个排序好的文件进行合并。
  • -M 将前面3个字母依照月份的缩写进行排序。
  • -n 依照数值的大小排序。
  • -u 意味着是唯一的(unique),输出的结果是去完重了的。
  • -o<输出文件> 将排序后的结果存入指定的文件。
  • -r 以相反的顺序来排序。
  • -t<分隔字符> 指定排序时所用的栏位分隔字符。
  • +<起始栏位>-<结束栏位> 以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。
  • –help 显示帮助。
  • –version 显示版本信息。
  • [-k field1[,field2]] 按指定的列进行排序。

实例

在使用 sort 命令以默认的式对文件的行进行排序,使用的命令如下:

sort testfile 

sort 命令将以默认的方式将文本文件的第一列以 ASCII 码的次序排列,并将结果输出到标准输出。

使用 cat 命令显示 testfile 文件可知其原有的排序如下:

$ cat testfile      # testfile文件原有排序  
test 30  
Hello 95  
Linux 85

使用 sort 命令重排后的结果如下:

$ sort testfile # 重排结果  
Hello 95  
Linux 85  
test 30

使用 -k 参数设置对第二列的值进行重排,结果如下:

$ sort testfile -k 2
test 30  
Linux 85 
Hello 95

Linux中tail与head命令用法详解

tail命令也是一个非常常用的文件查看类的命令,今天就为大家介绍下Linux tail命令的用法。

更多Linux命令详情请看:Linux命令速查手册

Linux tail命令主要用来从指定点开始将文件写到标准输出。很多人喜欢使用tail –f 来监控日志文件。

一、Linux tail命令格式

Linux tail命令 格式如下所示

tail [OPTION]… [FILE]…

Linux tail命令 参数如下所示

-f 循环读取

-q 不显示处理信息

-v 显示详细的处理信息

-c<数目> 显示的字节数

-n<行数> 显示行数

–pid=PID 与-f合用,表示在进程ID,PID死掉之后结束.

-q, –quiet, –silent 从不输出给出文件名的首部

-s, –sleep-interval=S 与-f合用,表示在每次反复的间隔休眠S秒

二、Linux tail命令使用示例

1)查看文件最后几行内容

1
2
3
4
5
6
7
$tail -5 linuxdaxue.com-access_log
180.175.51.163 - - [14/Jun/2016:11:45:09 +0800] "GET http://www.linuxdaxue.com/wp-content/uploads/2016/05/Shell-printf_thumb.jpg&h=64&w=100&q=90&zc=0&ct=1 HTTP/1.1" 200 2611
180.175.51.163 - - [14/Jun/2016:11:45:09 +0800] "GET http://www.linuxdaxue.com/wp-content/uploads/2016/05/Shell_thumb-2.jpg&h=64&w=100&q=90&zc=0&ct=1 HTTP/1.1" 200 2572
180.175.51.163 - - [14/Jun/2016:11:45:09 +0800] "GET http://www.linuxdaxue.com/wp-content/uploads/2016/05/Shell_thumb-3.jpg&h=64&w=100&q=90&zc=0&ct=1 HTTP/1.1" 200 2580
180.175.51.163 - - [14/Jun/2016:11:45:09 +0800] "GET http://www.linuxdaxue.com/wp-content/uploads/2016/05/Shell_thumb-1.jpg&h=64&w=100&q=90&zc=0&ct=1 HTTP/1.1" 200 2646
180.175.51.163 - - [14/Jun/2016:11:45:09 +0800] "GET http://www.linuxdaxue.com/wp-content/uploads/2016/06/Shell_thumb-1.jpg&h=64&w=100&q=90&zc=0&ct=1 HTTP/1.1" 200 2850
$

2)从第10行开始显示文件

1
tail -n +10 linuxdaxue.com-access_log

3)循环监视日志文件 tail -f /var/log/kern.log #循环读取显示系统内核log

1
2
3
$tail -f linuxdaxue.com-access_log
180.175.51.163 - - [14/Jun/2016:11:45:09 +0800] "GET http://www.linuxdaxue.com/wp-content/uploads/2016/05/Shell_thumb-1.jpg&h=64&w=100&q=90&zc=0&ct=1 HTTP/1.1" 200 2646
180.175.51.163 - - [14/Jun/2016:11:45:09 +0800] "GET http://www.linuxdaxue.com/wp-content/uploads/2016/06/Shell_thumb-1.jpg&h=64&w=100&q=90&zc=0&ct=1 HTTP/1.1" 200 2850

用法:head [选项]… [文件]…
将每个指定文件的前 10 行输出到标准输出。
如果指定了多于一个文件,在每块输出之前附加文件名称作为头部。

如果没有指定文件,或者文件为”-“,则从标准输入读取。

必选参数对长短选项同时适用。
-c, –bytes=[-]K 显示每个文件的前 K 字节内容;
如果数字前附加“-”字符,则除了每个文件的
最后 K 字节数据外显示其余全部内容
-n, –lines=[-]K 显示每个文件的前 K 行内容而非前 10 行内容;
如果数字前附加“-”字符,则除了每个文件的
最后 K 行数据外显示其余全部内容
-q, –quiet, –silent 不显示包含给定文件名的文件头
-v, –verbose 总是显示包含给定文件名的文件头
-z, –zero-terminated 以 NUL 字符而非换行符作为行尾分隔符
–help 显示此帮助信息并退出
–version 显示版本信息并退出

所给定的数字 K 后面可以附加乘数后缀:
b 512, kB 1000, K 1024, MB 1000*1000, M 1024*1024,
GB 1000*1000*1000, G 1024*1024*1024, 对于 T, P, E, Z, Y 同样适用。
也可以使用二进制前缀,如:KiB=K,MiB=M 等等。

如果想查看文件的前几行信息,用到了head命令,head -n 行数表示显示前面的几行信息

Linux之tail、head命令详解

Linux head 命令

Linux 命令大全 Linux 命令大全

head 命令可用于查看文件的开头部分的内容,有一个常用的参数 -n 用于显示行数,默认为 10,即显示 10 行的内容。

命令格式:

head [参数] [文件]

参数:

  • -q 隐藏文件名
  • -v 显示文件名
  • -c<数目> 显示的字节数。
  • -n<行数> 显示的行数。

实例

要显示 runoob_notes.log 文件的开头 10 行,请输入以下命令:

head runoob_notes.log

显示 notes.log 文件的开头 5 行,请输入以下命令:

head -n 5 runoob_notes.log

显示文件前 20 个字节:

head -c 20 runoob_notes.log