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

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

当时我最先想到的是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,如需转载请自行联系原作者


相关文章
|
人工智能 监控 测试技术
利用AI辅助工具提升软件测试效率
【2月更文挑战第17天】 随着科技的不断发展,人工智能(AI)在各个领域的应用越来越广泛。在软件测试领域,AI技术也发挥着重要作用。本文将探讨如何利用AI辅助工具提升软件测试效率,包括自动化测试、智能缺陷识别和预测等方面。通过引入AI技术,软件测试过程将变得更加高效、准确和可靠。
927 1
|
负载均衡 Linux
配置Centos7网卡聚合链路
配置Centos7网卡聚合链路
1237 0
配置Centos7网卡聚合链路
FeignClient打印请求失败的日志,打印所有feignCliet接口请求失败的错误日志,方便排查原因
FeignClient打印请求失败的日志,打印所有feignCliet接口请求失败的错误日志,方便排查原因
401 0
Could NOT find Protobuf (missing: Protobuf_PROTOC_EXECUTABLE)
Could NOT find Protobuf (missing: Protobuf_PROTOC_EXECUTABLE)
1901 0
Could NOT find Protobuf (missing: Protobuf_PROTOC_EXECUTABLE)
|
开发框架 .NET 程序员
C# 去掉字符串最后一个字符的 4 种方法
在实际业务中,我们经常会遇到在循环中拼接字符串的场景,循环结束之后拼接得到的字符串的最后一个字符往往需要去掉,看看 C# 提供了哪4种方法可以高效去掉字符串的最后一个字符
1121 0
|
12月前
|
机器学习/深度学习 人工智能 自然语言处理
AI技术在自然语言处理中的应用
随着人工智能技术的不断发展,自然语言处理(NLP)已经成为了一个重要的应用领域。本文将介绍一些常见的NLP任务和算法,并通过代码示例来展示如何实现这些任务。我们将讨论文本分类、情感分析、命名实体识别等常见任务,并使用Python和相关库来实现这些任务。最后,我们将探讨NLP在未来的发展趋势和挑战。
|
XML SQL JavaScript
在vue页面引入echarts,图表的数据来自数据库 springboot+mybatis+vue+elementui+echarts实现图表的制作
这篇文章介绍了如何在Vue页面中结合SpringBoot、MyBatis、ElementUI和ECharts,实现从数据库获取数据并展示为图表的过程,包括前端和后端的代码实现以及遇到的问题和解决方法。
在vue页面引入echarts,图表的数据来自数据库 springboot+mybatis+vue+elementui+echarts实现图表的制作
|
存储 关系型数据库 MySQL
C++文件服务器项目—FastDFS—1(一)
C++文件服务器项目—FastDFS—1(一)
365 0
|
Web App开发 移动开发 前端开发
|
编译器 开发工具 C语言
Keil软件使用及流水灯设计介绍
Keil软件是一种常用的嵌入式系统开发工具,主要用于C51单片机的编程和调试。下面将介绍Keil软件的使用和流水灯设计。 一、Keil软件的安装和配置 1. 下载Keil软件:首先需要从Keil官网下载Keil软件的安装包,然后运行安装包进行安装。 2. 配置目标设备:安装完成后,需要配置目标设备,选择对应的单片机型号和开发板。 3. 配置编译器:在Keil软件中,可以选择使用C语言编译器或汇编语言编译器,根据需要进行配置。 4. 配置调试器:如果需要进行调试,还需要配置调试器,选择对应的调试器型号和连接方式。 二、Keil软件的界面和功能介绍 1. 工程管理器:Keil软件的工
394 0