【问题标题】:Shell script to grep in a range of files用于在一系列文件中进行 grep 的 Shell 脚本
【发布时间】:2019-11-10 03:45:56
【问题描述】:

我正在设置一个脚本,它使用read 命令获取一些用户数据。使用这些数据,我需要搜索文件范围,然后进行一些过滤。 是这样的,

Enter fromtime

read fromtime

Enter totime

read totime

Enter the ID

read id

最初我通过 SSH 连接到服务器,然后我有一个目录,路径为 cd home/report/records 的记录,我有:

  • REC_201901020345.gz (yyyymmddhhmm)
  • REC_201901120405.gz
  • REC_201903142543.gz

等等。

这些文件有数据以及$id

当用户输入 $fromtime$totime 时,格式为 yyyymmddhh 。在这里,我需要转到该文件范围,然后转到 grep 以获取 $id 并显示。例如:

如果$fromtime2019010103 并且$totime2019031425。我只需要转到REC_201901020345.gzREC_201901120405.gzREC_201903142543.gz 的特定文件范围并执行grep 以查找用户输入的id

我已经尝试过使用if 条件,但它似乎不起作用。我是编写这样的脚本的新手。当我在这里描述所有内容时,可能会有错误。对不起。

source config.sh

Enter fromtime

read fromtime

Enter totime

read totime

Enter the ID

read id

ssh $user@$ip


cd /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文件的数据。

【问题讨论】:

  • 您的目录中有多少个文件?数百,一些视图数千甚至更多?你能发布你的代码吗,到目前为止?
  • 文件将是REC_yyyymmddhhmm.gz 除了日期之外没有其他变化吗?
  • @Edvin 格式为 yyyymmddhh。

标签: php bash shell ubuntu ssh


【解决方案1】:

要获取给定范围(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

【讨论】:

  • 我得到一个 bash 脚本错误,因为存在太多参数
  • 同目录下好像有没有REC前缀的文件。这就是发生错误的原因。代码已更新以处理该问题。
【解决方案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 的输出中。
对输入进行排序,得到所需的文件名,并用标记括起来。
sed 都只打印标记之间的行。
最后一个是命令,应该为每个文件名执行。

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

【讨论】:

  • 啊,这是一个创造性的解决方案。我喜欢。如果没有大量的 cmets,就很难理解,但这就是 bash 编程中经常发生的事情。
  • 如果在ssh $user@$ip$中使用它不属于脚本中的变量但属于远程主机端的执行,如$(ls...)或sed中的$d需要被转义\$.
  • @user0 我需要 fromdate 和 todate 之间的文件范围,这并没有给出文件范围,而只是给出了 fromdate 和 todate 的文件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多