有遍历目录所有文件中关键字命令行脚本引发的思考-阿里云开发者社区

开发者社区> 科技小先锋> 正文

有遍历目录所有文件中关键字命令行脚本引发的思考

简介:
+关注继续查看
有没有命令行脚本可以实现不使用管道重定向输出文件名和该关键字所匹配的行号

当时我最先想到的是sed和awk因为这些单行命令确实很强悍


前言:

Version: 0.1
Auther : 追马
QQ : 
993182876
Bug:
由于限制条件,不能使用管道和重定向,而且必须是命令行脚本,所以此命令行脚本存在bug
1、当前目录下不能存在目录,否则会报错
2、当然了,不能检索目录的话,也就实现不了对目录递归的功能了


那位大牛有更好的主意可以分享出来额!

i_f02.gif

实践之后才知道:

1、针对awk来实现,单引匹配行和文件名很容易,但是打印出关键字匹配行的行号有问题


[root@nginx ~]# pwd
/root
[root@nginx ~]# ls
anaconda-ks.cfg install.log install.log.syslog test
[root@nginx ~]# awk '/root/{print $0,FILENAME}' * #遍历当前目录下打印关键字匹配行和文件名
rootpw --iscrypted $1$cZww2NX0$w2U6fxAYpQqD.LWAl0cfY0 anaconda-ks.cfg
Installing rootfiles-8.1-6.1.el6.noarch install.log
root test
[root@nginx ~]#


2、针对sed,但匹配行号很容易,但是打印出文件名有问题,貌似对应的行号也是有问题的(这个原因是因为sed是按照匹配关键字行号然后所有文件行号累计得出的结果,估计是*匹配模式的问题


[root@nginx ~]#
[root@nginx ~]# sed -n '/root/=' * # 匹配行输出行号
9
248
290
[root@nginx ~]#
[root@nginx ~]# cat -n test
1
2 root
3 zhuima
[root@nginx ~]#


3、使用grep,可以打印出文件名:行号:行内容这样的模式,但这也不是我们需要的

[root@nginx ~]# grep -n 'root' *
anaconda-ks.cfg:9:rootpw --iscrypted $1$cZww2NX0$w2U6fxAYpQqD.LWAl0cfY0
install.log:212:Installing rootfiles-8.1-6.1.el6.noarch
test:2:root
[root@nginx ~]#
[root@nginx ~]# cat -n test
1
2 root
3 zhuima
[root@nginx ~]#


4、再次查看awk,内置函数FNR是可以打印出匹配行行号的


[root@nginx ~]# awk '/root/{print FNR,FILENAME}' *
9 anaconda-ks.cfg
212 install.log
2 test


5、格式化化输出结果


[root@nginx ~]# awk 'BEGIN{print "List your search result:\nNum\tFilename\n------------------------\n"}/root/{print FNR,"\t",FILENAME}END{print "----------END-----------"}' *


List your search result:

Num Filename
------------------------

9 anaconda-ks.cfg
212 install.log
2 test
----------END-----------
[root@nginx ~]#


网上有人的脚本可以参考下

来源: <http://blog.csdn.net/xuleilx/article/details/7582430>

#!/bin/sh

FILENAMES=

for i in `find/home/`
do
file $i |grep"text"
if [ "$?"=="0" ];then
{
echo $i
FILENAMES=$i
cat $i |grep-"html"| awk '{ print "'${FILENAMES}'"
,$0 }'
>>/tmp/log.txt
}
fi
done

FILENAMES是shell变量,而awk是Linux中独立于shell的一个工具。在awk中如果要解析shell变量,需要将变量拿到awk的作用域外面来,即先关闭awk的单引号,引用变量后再次打开。
echo $str | awk -F, '{print '$FILENAMES'}'




后记:此类题目使用命令行来实现的话,确实有点费周折,使用脚本相对来说简单一点,而且如何命令行编写的话存在bug,因为*匹配模式的出现可能会出现误判的情况,萝卜白菜,各有所爱吧,能实现需求就好!针对shell多写多练多看才是王道!



本文转自lovelace521 51CTO博客,原文链接:http://blog.51cto.com/lovelace/1317102,如需转载请自行联系原作者


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
KUBERNETES05_NFS坏境搭建、PV、PVC挂载目录、ConfigMap挂载文件、Secret挂载敏感信息(三)
KUBERNETES05_NFS坏境搭建、PV、PVC挂载目录、ConfigMap挂载文件、Secret挂载敏感信息(三)
8 0
/文件和目录权限chmod /更改所有者和所属组chown/umask/隐藏权限lsattr/chattr
2.14 文件和目录权限chmod 2.15 更改所有者和所属组chown2.16 umask2.17 隐藏权限lsattr/chattr     文件和目录权限chmod  文件权限: r     4       可读 w    2      可写 x     1    ...
1135 0
自动清除日期目录shell脚本
    很多时候备份通常会使用到基于日期来创建文件夹,对于这些日期文件夹下面又有很多子文件夹,对于这些日期文件整个移除,通过find结合rm或者delete显得有些力不从心。
806 0
QT遍历目录获取文件信息
QFileInfo 获取文件信息:文件名称,路径,大小,创建时间,修改时间,权限等 使用 路径: UNIX: /home/dipper/file1 Windows: C://dipper//file1 构造函数: QFileInfo fileInfo(path); QFileInfo fileInfo; fileInfo.
780 0
6967
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载