Linux四剑客findgrepsedawk
1.find【擅长在目录下找文件】
find 命令用来在指定目录下查找文件
语法: find path -option
进阶: find path -option [-print][ -exec command] {} ;
注意:{} 表示查询的结果。 1.1 常用查询选项option
-name: 根据名称匹配
-iname: 忽略大小写 # 例如:查找当前目录下以log为结尾的文件: $ find ./ -name "*log"
-user: 根据所属与的组进行查询 # 例如:查当前路径下,属于sichuan的文件: $ find . -user sichuan
-type: 根据类型进行查找 f 文件 find ./ -type fd 目录 find . -type dc 字符设备文件 find . -type c b 块设备文件 find . -type b l 链接文件 find . -type l p 管道文件 find . -type p # 例如:查当前路径下所有文件 $ find ./ -type f
-size: 根据文件大小匹配 -n 小于 大小为 n 的文件 +n 大于 大小为 n 的文件 # 查找 /ect 目录下,小于 10000 字节的文件 $ find /etc -size -10000c # 查找 /etc 目录下,大于 1M 的文件 $ find /etc -size +1M
-mindepth n: 从第 n 级目录开始搜索 # 从/etc 的第三级子目录开始搜索。 $ find /etc -mindepth 3 -name "*.conf"
-maxdepth n: 表示至多搜索到第 n-1 级子目录。 #在 /etc 中搜索符合条件的文件,但最多搜索到2级子目录。 $ find /etc -type f -name "*.conf" -size +10k -maxdepthc 2
-regex: 基于正则表达式匹配文件路径
-iregex: 基于正则表达式匹配文件路径(忽略大小写) # 匹配当前目录下,所有.txt和.pdf文件,用转意 $ find ./ -regex ".*(.txt|.pdf)#34; 1.2 根据时间戳进行搜索
UNIX/Linux 文件系统每个文件都有三种时间戳 访问时间 (-atime/天,-amin/分钟):用户最近一次访问时间。 修改时间 (-mtime/天,-mmin/分钟):文件最后一次修改时间。 变化时间 (-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间。
-mtime :根据文件更改时间查找,单位小时 -n n 天以内修改的文件。 +n n 天以外修改的文件。 n 正好 n天 修改的文件。
-mmin: 根据文件更改时间查找,单位分钟 -n n 分钟以内修改过的文件 +n n 分钟之前修改过的文件 # 查询 /etc 目录下30分钟之前修改过的文件。 $ find /etc -mmin +30 # 查询 /etc 目录下30分钟之内修改过的目录。 $ find /etc -mmin -30 -type d # 查询 /etc 目录下,5天以内修改 且以 conf 结尾的文件 $ find /etc -mtime -5 -name "*.conf" #查询 /etc 目录下,10天之前修改,且属于 sichuan的文件 find /etc -mtime +10 -user sichuan 1.3 对查找到的文件如何操作
-print : 打印输出。 默认的选项,即打印出找到的结果。
-exec: 对搜索到的文件执行特定的操作,固定的格式为:-exec "commond" {} ; 注意:{} 表示查询的结果。 # 搜索 /etc 目录下的文件(非目录),文件以.conf结尾,且大于10k的文件 然后将其删除。 $ find /etc -type f -name "*.conf" -size +10k -exec rm -f {} ; # 搜索条件同 例1 一样,但是不删除,只是将其复制到 /root/conf 目录下 $ find /etc -type f -name "*.conf" -size +10k -exec cp {} /root/conf/ ; # 将 /data/log/ 目录下以.log 结尾的文件,且更改时间在 7 天以上的删除。 $ find /data/log -name "*.log" -mtime +7 -exec rm -f ;
-ok 和 -exec 的功能一样,只是 每次操作 都会给用户提示。
逻辑运算符
-a:与 (默认情况查询条件之间都是 与 的关系)
-o:或
-not | ! 非 #或 $ find . ( -name "*.txt" -o -name "*.pdf" ) $ find . -name "*.txt" -o -name "*.pdf" #找出/home下不是以.txt结尾的文件 $ find /home ! -name "*.txt" 1.4 xargs
xargs: 可以将一个命令的输出作为参数发送给另一个命令。
当前目录搜索所有文件,文件内容 包含 "aaa" 的内容 $ find ./ -type f -name "*" | xargs grep "aaa" ./a.txt:aaa ./b.txt:aaa
统计代码行数 # 代码行数统计, grep -v "^#39;过滤空白行 wc -l $ find ./ -name "*.java"|xargs cat|grep -v ^$|wc -l 1.5 常用find命令
查找当前目录下所有.txt文件并把他们拼接起来写入到all.txt文件中 $ find ./ -type f -name "*.txt" -exec cat {} ;> ./all.txt
将30天前的.log文件移动到old目录中 $ find . -type f -mtime +30 -name "*.log" -exec cp {} old ;
找出当前目录下所有.txt文件并以"File:文件名"的形式打印出来 $ find . -type f -name "*.txt" -exec printf "File: %s " {} ;
因为单行命令中-exec参数中无法使用多个命令,以下方法可以实现在-exec之后接受多条命令 $ -exec ./text.sh {} ;
要列出所有长度为零的文件 $ find . -empty
扩充:查找关键字出现的行数
Linux cat查看文件,查找关键字(grep),统计(wc -l) #cat查找关键字出现的行数 语法:cat 文件 | grep 关键字 | wc -l $cat /proc/meminfo |grep Swap | wc -l Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数、字数、行数,并将统计结果显示输出。 #1.命令格式: wc [选项]文件... #2.命令参数: -c 统计字节数。 -l 统计行数。 -m 统计字符数。这个标志不能与 -c 标志一起使用。 -w 统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串。 -L 打印最长行的长度。 -help 显示帮助信息 --version 显示版本信息 2.grep【擅长在文件中匹配文本】
grep命令 是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来(匹配的标红) 语法: grep [option] pattern file 简介:常用来做全局数据的查询定位(最擅长文本过滤)
命令参数: -A<显示行数>:显示匹配行及后面n行内容 -B<显示行数>:显示匹配行及前面n行内容 -C<显示行数>:显示匹配行及前后n行内容 -c:统计匹配成功的行数 -e :实现多个选项间的逻辑or 关系 。或者使用egrep$ egrep "^root|bash#39; passwd$ grep -e "^abc" -e "b#39; a.txt -E:扩展的正则表达,相当于egrep -f FILE:从FILE获取PATTERN匹配 -F :相当于fgrep -l:列出文件内容符合指定的范本样式的文件名称。 -L:列出文件内容不符合指定的范本样式的文件名称 -i :字符忽略大小写 -n:显示匹配的行号 -o:仅显示匹配到的字符串 -q: 静默模式,不输出任何信息 -s:不显示错误信息。 -v:显示不被pattern 匹配到的行,相当于[^] 反向匹配grep -v "^#39; :命令的作用是过滤空白符 空白行:^$ -w :只匹配整个单词,而不是字符串的一部分(如匹配’magic’,而不是’magical’), --color:匹配到的关键字会高亮显示 < 和 > 分别标注单词的开始与结尾。(类似模糊查询)grep man * 会匹配 ‘Batman’、’manic’、’man’等grep ‘bbbbb 4:BBBBASDABBDA #仅显示匹配到的字符串 $grep -o ASDA test.txt ASDA #静默模式,不显示 $grep -q aa test.txt #取反 $grep -v aaa test.txt bbbbb BBBBASDABBDA #匹配整个单词 $grep -w aaa aaa #从file获取PATTERN匹配 $cat grep.txt aaa $grep -f grep.txt test aaa AAAaaa # 使用-l选项,找出文件内容中包含first的文件名 $ grep -l "first" *.txt 1.txt # 使用-L选项,找出文件内容中不包含first的文件名 $ grep -L "first" *.txt 2.txt 3.txt # 以leo开头的行 $ grep "^leo" /etc/passwd # 以bash结尾的行 $ grep "bash#39; /etc/passwd # 我们尝试匹配bin这个"词"(只包含bin 比匹配sbin这样的)在正则表达式中,我们通常用尖括号表示一个"词" $ grep " First Wed h1Helloh1 h2Helloh2 h3Helloh3