高级文件操作命令_文件查找
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 +1和 find / -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是查到一个就交给管道符然后执行后边的命令,然后再查一个,压力会小一点