为了账号安全,请及时绑定邮箱和手机立即绑定

用于在一系列文件中进行 grep 的 Shell 脚本

用于在一系列文件中进行 grep 的 Shell 脚本

PHP
狐的传说 2021-09-05 18:00:43
我正在设置一个脚本,该脚本通过read命令获取一些用户数据。使用这些数据,我需要搜索文件范围,然后进行一些过滤。这是它的样子,Enter fromtimeread fromtimeEnter totimeread totimeEnter the IDread id最初我通过 SSH 连接到服务器,然后在那里我有一个目录,cd home/report/records这里有路径记录,我有:REC_201901020345.gz (yyyymmddhhmm)REC_201901120405.gzREC_201903142543.gz等等。这些文件包含数据以及$id.当用户输入时$fromtime,$totime它将是 yyyymmddhh 格式。在这里,我需要转到该范围的文件,然后grep进行$id显示。例如:如果$fromtime是2019010103并且$totime是2019031425。我只需要转到那些特定范围的文件,即REC_201901020345.gz, REC_201901120405.gz,REC_201903142543.gz并执行grep以查找id用户输入的内容。我已经使用if条件尝试过这个,但它似乎不起作用。我是编写此类脚本的新手。当我在这里描述所有内容时可能会有错误。对不起。source config.shEnter fromtimeread fromtimeEnter totimeread totimeEnter the IDread idssh $user@$ipcd /home/report/records# <-- need to know what to add here as described here, to navigate to the# <-- specific range $fromtime-$totime. Then the command to find id will be zfgrep $id *.gz结果应该只是id指定.gz文件范围内带有' 的数据。
查看完整描述

2 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

试试下面的命令。

echo -e "$(ls -1 REC_????????????.gz 2>/dev/null)\nREC_${fromtime}##\nREC_${totime}##" | sort | sed -n "/##/,/##/p" | sed '1d;$d' | xargs zfgrep -a "$id"

解释:
'fromdate' 和 'todate' 连同##(比如标记)被附加到ls.
对输入进行排序,从而得到用标记括起来的所需文件名。
Both sed,仅打印标记之间的线条。
最后一个是命令,应该为每个文件名执行。

您可以省略管道和所有下一个命令,从结尾开始,并查看输出是如何构建的。


查看完整回答
反对 回复 2021-09-05
?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

要获取给定范围(fromtime、totime)内的文件列表,可以使用以下 shell 脚本:


declare -i ta

for file in REC*.gz

do 

    ta=$(echo "${file}" | grep -oP 'REC_\K(.*)(?=[[:digit:]]{2}.gz)')

    if [ "${ta}" ] ; then  

       if [ ${ta} -le ${totime} -a ${ta} -ge ${fromtime} ] ; then 

          echo -e "${file}"

       fi

    fi  

done


查看完整回答
反对 回复 2021-09-05
  • 2 回答
  • 0 关注
  • 135 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信