我有一个脚本,它与来自多个日志文件的目录中的字符串匹配,如下所示:
#!/bin/sh
# Collect Customer ID as input
read -p "Enter Customer ID: " custid
echo "Searched customer ID $custid found in following logs: "
# Find the customer id as string in specified directory
find /usr/local/tomcat9/logs/ -type f -exec grep -l "$custid" {} \;
这将输出包含搜索字符串的日志文件列表。例如:
Enter Customer ID: 2001NM-100313
Searched customer ID 2001NM-100313 found in following logs:
/usr/local/tomcat9/logs/localhost_access_log.2017-10-04.txt
/usr/local/tomcat9/logs/localhost_access_log.2017-07-11.txt
/usr/local/tomcat9/logs/localhost_access_log.2017-11-02.txt
/usr/local/tomcat9/logs/localhost_access_log.2017-09-11.txt
/usr/local/tomcat9/logs/localhost_access_log.2017-08-09.txt
/usr/local/tomcat9/logs/localhost_access_log.2017-06-11.txt
我希望这个输出像列表一样:
1. /usr/local/tomcat9/logs/localhost_access_log.2017-10-04.txt
2. /usr/local/tomcat9/logs/localhost_access_log.2017-07-11.txt
3. /usr/local/tomcat9/logs/localhost_access_log.2017-11-02.txt
4. /usr/local/tomcat9/logs/localhost_access_log.2017-09-11.txt
5. /usr/local/tomcat9/logs/localhost_access_log.2017-08-09.txt
6. /usr/local/tomcat9/logs/localhost_access_log.2017-06-11.txt
它会要求输入数字 1/2/3/4/5/6 以打开该编号文件,即;如果我按 4 它将发送命令
vim /usr/local/tomcat9/logs/localhost_access_log.2017-09-11.txt
并且将在整个文件中搜索字符串“2001NM-100313”。
我的目标是从日志文件中读取包含此字符串的整行/行(字符串可能有多行),可能有多个日志文件具有此字符串和多个日期,我需要选择任何日期文件并阅读日志。
只需使用
select
(bash
内置)。所以你想要的代码可能是:
请注意,如果您的文件名包含空格,则会中断。也可以看看:
但是,如果您
select
直接从 调用内置函数find
,这将轻松处理空格。因此,在我能想到的所有情况下,以下内容实际上都更好:阅读你的问题提醒我一直想要一个简单的脚本,让我更容易在文件中搜索特定字符串,然后查看包含该字符串的文件之一。在您的脚本和 saga 建议使用数组的基础上,我创建了我的脚本并完成了您的脚本。:)
请注意:这个脚本是 /bin/bash,而不是 /bin/sh,因为我不知道如何让数组在 /bin/sh 中工作...
你的脚本:
编辑:虽然上面的脚本可以很好地解决原始问题,但我建立在 Wildcard 的答案之上,因此我的脚本可以处理带有空格的文件并提供各种工具来打开所选文件。
我的脚本: