1.查找

find

查找文件或目录

语法

  1. find [搜索范围] [选项]

选项

-name        按照指定的文件名查找
-path       可以对文件的dir_name、file_name匹配
-type        通过文件类型查找
-mtime      查找几日之内或几日之前的文件
-mmin         查找几分钟之内或几分钟之前的文件
-size        按照指定的文件大小查找文件

-a:与,即&&(默认都是与)
-o:或:即||
-not:非,即条件结果取反

-empty        搜索空文件
-user        查找属于指定用户名文件
-group        查找属于指定用户组文件

通过文件名搜索

#根据名称查找/home目录下的hello.txt文件
find /home -name hello.txt

#将当前目录及其子目录下所有文件后缀为 .txt 的文件列出来
find . -name "*.txt"

#将/etc及其子目录下所有文件后缀为 .conf 的文件列出来
find /etc -name "*.conf"

#查找/opt/dir目录下的.txt文件
find /opt -path "/*dir*/*.txt"
--在这里是不能使用-name的。因为 -name 是不能使用 / 的,除非文件名包含了 / , 因为 -name 只能匹配 file_name (即文件名),并不匹配 dir_name (即目录名)

通过文件的类型来搜索

#在/opt目录下查找所有的目录
find /opt -type d

#在/opt目录下查找所有的文件
find /opt -type f

通过文件的时间搜索

#在/opt目录下查找修改时间在5日以内的文件
find /opt -mtime -5

#在/opt目录下查找修改时间在3日以前的文件
find /opt -type f -name "*.txt" -mtime +3

#在/opt目录下查找更改时间在5分钟以内的.txt文件
find /opt -type f -name "*.txt" -mmin -5

#在/opt目录下查找修改时间在10分钟以前的文件
find /opt -mmin +10

注意:

  • 无论是 -mtime +5 还是 -mtime -5 ,第五天内修改过的文件都不会被搜索出来,可看下图
    查找 - 图1

通过文件的大小来搜索

b:512字节的块(默认)1b = 512c

c:bytes,指定字节大小

w:等价于两个bytes,1w=2c,一般用户匹配中文

k:平时常说的1kb,1k=1024c=2b

M:1MB,1M=1024k=2048b

G:1GB,1GB=1024MB=2048*1024b

+n        大于
-n        小于
n        等于
#在~/test目录下查找所有size=0字节的文件
find ~/test -size 0


#在~/test目录下查找所有size<100k的文件
find ~/test -size -100k


#在~/test目录下查找所有size>1MB的文件
find ~/test -size +1M

通过编程中的“与、或、非”来搜索

  • -a:与,即&&(默认都是与)
  • -o:或:即||
  • -not:非,即条件结果取反
#在~/test目录下查找文件大小在1kb和10kb内的所有文件
find ~/test -size +1k -size -10k
find ~/test -size +1k -a -size -10k


#在~/test目录下查找大于1kb或类型为普通文件的文件
find ~/test -size +1k -o -type f


#在~/test目录下查找非空文件
find ~/test -not -size 0


#在~/test目录下查找文件或目录
find ~/test -type f -o -type d

搜索空文件

find ~/test -empty -type f

通过文件所属用户搜索

find ~/test -user root

通过文件所属组group搜索

find ~/test -group root

which

查找某个指令的路径

#查找ls命令的位置
which ls

2.搜索

grep

在文件中查找字符串

  • 常常和管道符 | 结合使用
  • grep过滤查找,管道符 “|”,表示将前一个命令的处理结果输出传递给后面的命令处理

语法

grep [选项] 查找内容 原文件

grep的常用选项参数

-G    默认值
-F    相当于使用fgrep,但必须用 -F
-E    相当于使用egrep,但必须用 -E。匹配多个条件使用
-V    打印 grep 的版本号
#查找f1和dir文件
ls  | grep -E "f1|dir"

匹配控制选项参数

-n        显示匹配行及行号
-e        当你有多个正则表达式想同时匹配时,可以用 -e,一个 -e 接一个正则表达式,它们是或的关系,不是与的关系
-i        忽略首字母大小写
-v        反转匹配,选择没有被匹配到的内容
-w        匹配整词,精确的单词,单词的两边必须是非字符符号(即不能是字母数字或下划线)
-x        精确匹配。仅选择与整行完全匹配的匹配项
#查找含f或d的文件
ls | grep -e f -e d

#查找dir文件,忽略首字母大写。意思就是大小写都显示
ls | grep -i dir
--结果:
dir
DIR

#包含dir的文件都不显示
ls | grep -v dir

#查找jj.txt。只输入一个j是匹配不出来的
ls | grep -w jj

#查找jj.txt。与-w相比,-x必须输入整个文件名
ls | grep -x jj.txt

一般输出控制选项

-s            禁止显示错误信息
-q            安静模式,不会有任何输出内容,查找到匹配内容会返回0,未查找到匹配内容就返回非0
-m num        匹配 num 次后停止
-c            匹配成功数量
-l            列出匹配成功结果的文件来源(标准输入或文件名称)
-H            给每一个匹配结果打印来源(标准输入、文件名)
#匹配d开头文件3次
ls | grep -m 3 d

#匹配dir文件的数量
ls | grep -c dir

输出控制参数讲解

-b    输出的同时打印字节偏移
-n    输出的同时打印行号
-H    给每一个匹配结果打印来源(标准输入、文件名)
-h    输出是不显示来源(默认)
-o    只显示匹配 PATTERN 的部分
#显示匹配的dir同时显示行号
ls | grep -n dir

上下文线控制选项

-A num    匹配到搜索到的行以及该行下面的num行
-B num    匹配到搜索到的行以及该行上面的num行
-C num    匹配到搜索到的行以及上下各num行
#显示dir3及下面的2行
ls | grep -A 2 dir3

#显示dir3及上面的2行
ls | grep -B 2 dir3

#显示dir3及上下的2行
ls | grep -C 2 dir3

文件和目录选项

-a        不忽略二进制的数据
-d        当要查找的是目录而非文件时,必须使用这项参数
-r        以递归方式读取每个目录下的所有文件; 这相当于-d recurse选项。

常用语法

写的正则表达式最好用 “”包起来,当碰到需要转义符的时候才会生效

#查找/opt/dir下.txt文件
ls /opt/dir | grep ".txt"

#查找指定进程
ps -ef | grep "java"

#查找指定进程并统计数量
ps -ef | grep -c "java"

#从文件中查找关键字
grep "b" jj.txt

#从文件中查找关键字并输出它的行号
grep -n "b" jj.txt

#从多个文件中查找关键字
grep "b" jj.txt bb.txt

#查找jj.txt文件中的“b”
cat jj.txt | grep "b"

#查找jj.txt文件中的“b”,并显示行号
cat jj.txt | grep -n "b"

#从文件中查找关键字后,再从结果中找到指定关键字
cat jj.txt | grep "s" | grep "b"

#找出文件中的空白行
grep -n ^$ jj.txt

3.查看历史指令

选项

-c        清除历史记录
-w        将目前的 history 记忆内容写入 histfiles

例子

#查看所有历史指令
history

#查看命令mkdir 的历史执行记录
history | grep mkdir 

#查看最近使用的10个指令(两种方式)
history 10
history | tail -10

#执行历史记录中,序号为5的命令 
!5

#执行上一条命令(直接输入两个感叹号)
!!

#清除历史记录
history -c

#将当前所有历史记录写入历史文件中,默认写入 ~/.bash_history 
history -w

cat ~/.bash_history#查看写入的历史记录