高级文件操作命令_文件查找

wc         统计字符

tr      字符替换

cut    字符切割

sort   排序

uniq   统计连续重复行

head   列出文件头部

tail     列出文件尾部

grep   过滤

diff     比较文件不同

 

wc(word count)

cat file1 | wc    将cat查询的结果交给管道符 然后执行统计操作

第一个是行数   第二个是单词数    第三个是字符数(空格和换行符都算作一个字符)

拓展(l:line,w:word,c:character):

cat file1 | wc -l    查看有多少行

cat file1 | wc -w    查看有多少单词

cat file1 | wc -c    查看有多少字符

tr

cat file1 | tr h H  是将所有的h替换成H,但是结果在查看还是没有变

因为cat只做查看用的呢

拓展:

cat file1 | tr he H  当你想把he替换成H的时候会出现这样的情况

所以你只能用相等的字符个数替换相等的字符个数,类似这样,需要一个字符对应一个字符

实际应用中我们会使用把多行换做成一行:

意思就是:需要把换行符替换成空格,结果如上,这就说明了在hao后边也是有一个换行符的,这就是为什么最上边统计字数会是20个

换行符有两种 \n  和 012

cut

举例:如果我们需要查看当前系统的所有用户名,就需要从/etc/passwd中截取每一行的用户名

使用如下命令(d:delimiter分割符,f:field区域 详情参数使用 cat --help查询):

将查询结果交给管道符然后执行切割操作,分隔符为冒号,截取冒号分割后的第一个区域

cat /etc/passwd | cut -d : -f 1

sort

默认按照每一行的第一个字符排序

 

如果第一列的所有字符都相同,就会按照第二列排序,以此类推

或者添加参数指定排序键(t:分隔符,指定分隔符为空格   k:指定排序键  2.1:分割后的第二部分的第一列)

cat file1 | sort -t ' ' -k 2.1

但是他还是按照第一个字母排序,如果遇到数字排序像 23和123 反而123会排到前面

这个时候可以用 -n参数

不太直观是吧,再来个切割

cat /etc/passwd  |  sort  -t : -k 3 | cut -d : -f 3

对比  cat /etc/passwd  | sort  -t : -k 3 -n | cut -d : -f 3

反向排序使用-r

 

或者使用tac反向排序

cat /etc/passwd | sort -t : -k 3 -n |tac | cut -d : -f 3

uniq 统计连续重复行

默认情况是只显示重复行一次

只列出连续重复行(d: double)

cat file1 | uniq -d

统计连续重复行的次数(c:count)

 

只列出不重复行(u:ununique)

head 列出文件头部

默认只列出文件的头十行

cat /etc/passwd | head

或者指定前几行  : cat /etc/passwd | head -2 列出前两行

tail 列出文件尾部

跟head相同

cat /etc/passwd | tail      显示末尾十行

cat /etc/passwd | tail  -5 显示末尾五行

其实tail命令比head命令更常用,比如在查看日志系统的时候,日志更新的时候能够及时的查看

举例:

首先查看我们的系统日志

tail -f  /var/log/message

如果没有日志就显示空白

此时换个窗口执行重启服务器

/etc/init.d/rsyslog restart

在tail查看日志命令下会出现新的日志

grep

cat file1 | grep a        过滤带a的行

cat file1 | grep -c a    统计带a的有多少行

只统计一行里只有a的(w:word)

cat file1 | grep -w a 

不分区大小写(i:ingore)

取反(v)

diff 比较文件不同

主要用途是可用于对一个文件进行打补丁操作

可以看到file2比file1文件多了三行

可以使用diff命令显示不同(u:表示以标准模式)

diff file1 file2 -u

展现出来的不同打到一个补丁文件中

diff file1 file2 -u > diff.patch

那这个补丁文件有什么用?可以用这个补丁文件给file1打补丁

patch file1 diff.patch

 拓展

以上便是一些文件的高级操作命令,接下来出一道题

比较 /bin目录下与 /usr/bin目录下有多少相同的命令?

ls /bin  /usr/bin  | sort  |  uniq -d |  wc -l

同时列出/bin 和 /usr/bin目录下的所有文件,然后执行默认排序,这样相同的命令就都挨着了,然后只查询出重复的文件,最后统计行数

 

再出一题

从日志中筛选重要信息

首先要知道下面几个命令

 

tail  -n  10  test.log   查询日志尾部最后10行的日志;

 

tail -n +10 test.log    查询10行之后的所有日志;

 

head -n 10  test.log   查询日志文件中的头10行日志;

 

head -n -10  test.log   查询日志文件除了最后10行的其他所有日志;

场景1: 按行号查看---过滤出关键字附近的日志

cat -n test.log |grep "school"  得到关键日志的行号,假如得到的行号是100

cat -n test.log |tail -n +100|head -n 20

tail -n +100表示查询100行之后的日志

head -n 20 则表示在前面的查询结果里再查前20条记录

场景2:那么按日期怎么查呢?  通常我们非常需要查找指定时间端的日志

sed -n '/2014-12-17 16:17:20/,/2014-12-17 16:17:36/p'  test.log

特别说明:上面的两个日期必须是日志中打印出来的日志,否则无效.

关于日期打印,可以先 grep '2014-12-17 16:17:20' test.log 来确定日志中是否有该时间点,以确保第4步可以拿到日志

这个根据时间段查询日志是非常有用的命令.

如果我们查找的日志很多,打印在屏幕上不方便查看, 有两个方法:

(1)使用more和less命令, 如: cat -n test.log |grep "school" |more     这样就分页打印了,通过点击空格键翻页

(2)使用 >xxx.txt 将其保存到文件中,到时可以拉下这个文件分析.如:

cat -n test.log |grep "school"  >xxx.txt

文件查找

find命令是地毯式的搜索,他会从指定目录开始一级一级的搜索

locate本身维护者一个数据库配置文件, 在数据库下边指定的所有文件他都不会再去搜索了,所以他的搜索速度会加快很多

但是find命令能指定很多的条件

which

后边跟命令,像 which ls  查出的都是命令的绝对路径

whereis

跟which相似,会更具体一些

 

whoami

查询当前用户

locate用法:

后边直接跟关键字比如:

locate rpm

如果有上述提示请执行否则请忽略

updatedb

可以看出查出来的都是带rpm关键字的,如果想查单独的一个rpm,用这个就不好使了,就应该用find了

locate维护着一个数据库的配置文件/etc/updatedb.conf

第二行PRUNEFS里面放的都是文件系统,其中最常用的就是iso9660(光盘文件系统)

凡是列在第二行中的文件,都不会被locate查找

第四行是目录,凡是在该目录下的文件,也都不会被locate查找到

find命令

格式: find + 查找路径 + 条件 + 条件操作符 + 查找文件后额外的操作(查出来的都删掉||查出来的都复制到另一个目录)

 

路径不写表示在当前路径下查找,如果写路径,必须写绝对路径

 

1.根据名称查找

find /  -name  rpm

 

它会精确的查找根目录下名字叫做rpm的文件

查找以rpm开头的所有文件:find  /  -name   rpm*  或者find  / -name  'rpm*'

查找以rpm开头的所有文件且忽略大小写:find  /  -iname   rpm*  或者find  / -name  'rpm*'

查找带rpm关键字的文件: find  /  -name   *rpm* 或者find / -name  '*rpm*' 此时的功能就跟locate一样了

?代表一个字符

find / -name  rp?  查询文件以rp开头,且文件名长度为3(同理,rp??长度为4喽)

2.按大小查找(+ 代表大于 -代表小于 不写代表等于(搞笑呢,等于))

1kb等于两个数据块

100MB=102400KB=204800个数据块

查找文件大于100M的: find  /  -size  +204800

查询文件大于5M的:find  /  -size  +5M

查询文件小于5M的:find  /  -size  -5M

查询文件大于5M且小于10M的 find  /  -size +5M -and -size -10M

查询文件大于5M的npm文件: find / -size +5M -and -name '*rpm*'

-and 也可以用 -a

3.按时间查找

首先看时间的概念

使用stat查看test1文件的属性

stat test1

access访问时间

modify修改文件内容时间

change修改文件属性,比如所属组,所有者,权限等

ls -l显示的时间其实是modify时间

(time都是按天来算)

查找一天以前访问的文件:find / -atime +1

查找一天以内访问的文件:find / -atime -1

同理还有find / -mtime +1find  / -ctime +1

(min都是按分钟来算的)

用法和time一样

 

4.按文件类型查找

f 普通文件

d 目录

b 块设备文件(磁盘U盘)

c 字符设备文件(终端)

s socket套接字文件

l 快捷方式pipe 管道文件

查找目录文件:find / -type d

 

 

5.按权限查找

查找根目录下权限是777的文件:find / -perm 777

查找根目录下用户是root的文件:find / -user root

查找根目录下组是root的文件:   find / -group root

 

最开始说过查找文件之后可以有额外的操作,举例:

find + 查找路径 + 条件 + 条件操作符 + 查找文件后额外的操作(查出来的都删掉||查出来的都复制到另一个目录)

查找文件的同时查看文件类型(file指查看文件类型,   ;是-exec的结束符   \是把分号从shell命令转到find命令,因为\在shell中

有特殊意义,可以用ls ; pwd看看,他会顺序执行ls和pwd      {}指当前find的文件  )

 find /test1/ -name file1 -exec file {} \;

查找文件的同时copy文件到根目录

find /test1/ -name file1 -exec cp {} /  \;

像exec这种命令比较可怕,他没有任何提示,可以使用-ok代替

find /test1/ -name file1 -ok cp {} /  \;

 

 

另外,像exec和ok命令都是将find的结果一次性全部执行cp等命令,这样在查询结果极大的情况下就可能内存溢出

而xargs是查到一个就交给管道符然后执行后边的命令,然后再查一个,压力会小一点

 

posted on 2016-03-09 23:03  itliucheng  阅读(328)  评论(0编辑  收藏  举报