【问题标题】:ksh: shell script to search for a string in all files present in a directory at a regular intervalksh:定期在目录中存在的所有文件中搜索字符串的 shell 脚本
【发布时间】:2014-01-30 23:56:47
【问题描述】:

我在 unix (SUN) 中有一个目录(输出)。创建的文件有两种类型,文件名带有时间戳前缀。这些文件每隔 10 分钟创建一次。 e.克:

1.  20140129_170343_fail.csv (some lines are there)
2.  20140129_170343_success.csv (some lines are there)

现在我必须在输出目录中存在的所有文件中搜索特定字符串,如果在失败和成功文件中找到该字符串,我必须计算这些文件中存在的行数并将输出保存到cnt_succcnt_fail 变量。如果没有找到该字符串,我将在 20 秒的睡眠计时器后再次在同一目录中搜索。

这是我的代码

#!/usr/bin/ksh

for i in 1 2
do
  grep -l 0140127_123933_part_hg_log_status.csv /osp/local/var/log/tool2/final_logs/* >log_t.txt;  ###  log_t.txt will contain all the matching file list
  while read line   ### reading the log_t.txt
  do
    echo "$line has following count"
    CNT=`wc -l $line|tr -s " "|cut -d" " -f2`
    CNT=`expr $CNT - 1`
    echo $CNT
  done <log_t.txt
  if [ $CNT > 0 ]
  then
    exit
  fi

  echo "waiitng"
  sleep 20
done

我面临的问题是,我无法在文件中获取 _success 和 _fail 并检查它们的计数

【问题讨论】:

  • 您是否希望在kshbash 中执行此操作?
  • 它的 ksh 不是 bash。

标签: shell unix ksh


【解决方案1】:

我不确定ksh,但while ... do; ... done 因使用您在bash 中使用的任何变量而臭名昭著。 ksh 可能类似。

如果我正确理解您的问题,SunOS 有 grepuniqsort AFAIK,因此可能的替代方案是......

首先:

$ cat fail.txt
W34523TERG
ADFLKJ
W34523TERG
WER
ASDTQ34T
DBVSER6
W34523TERG
ASDTQ34T
DBVSER6

$ cat success.txt
abcde
defgh
234523452
vxczvzxc
jkl
vxczvzxc
asdf
234523452
vxczvzxc
dlkjhgl
jkl
wer
234523452
vxczvzxc

现在:

egrep "W34523TERG|ASDTQ34T" fail.txt | sort | uniq -c
    2 ASDTQ34T
    3 W34523TERG

egrep "234523452|vxczvzxc|jkl" success.txt | sort | uniq -c
    3 234523452
    2 jkl
    4 vxczvzxc

根据输入数据,您可能想查看sort 在您的系统上有哪些选项。检查uniq 的选项也可能很有用(它不仅可以计算重复项)。

【讨论】:

    【解决方案2】:

    认为你想要这样的东西( 都可以)

    #!/bin/ksh
    
    while read -r file; do
      lines=$(wc -l < "$file")
      ((sum+=$lines))
    done < <(grep -Rl --include="[1|2]*_fail.csv" "somestring")
    echo "$sum"
    

    请注意,这将匹配以 12 开头并以 _fail.csv 结尾的文件,不清楚这是否是您想要的。

    例如假设我有两个文件,一个以 1 开头(包含 4 行),一个以 2 开头(包含 3 行),两个文件都以 `_fail.csv 结尾,位于我当前工作目录下的某处

    > abovescript
    7
    

    了解这里的 grep 选项很重要

       -R, --dereference-recursive
              Read all files under each directory,  recursively.   Follow  all
              symbolic links, unlike -r.
    

       -l, --files-with-matches
              Suppress  normal  output;  instead  print the name of each input
              file from which output would normally have  been  printed.   The
              scanning  will  stop  on  the  first match.  (-l is specified by
              POSIX.)
    

    【讨论】:

      【解决方案3】:

      我终于找到了解决方案。完整代码如下:

      #!/usr/bin/ksh
      
      
      file_name="0140127_123933.csv"
      
      for i in 1 2
      do
      
      grep -l $file_name /osp/local/var/log/tool2/final_logs/* >log_t.txt;
      
          while read line
          do
          if [ $(echo "$line" |awk '/success/') ]           ## will check the success file
          then
          CNT_SUCC=`wc -l $line|tr -s " "|cut -d" " -f2`
          CNT_SUCC=`expr $CNT_SUCC - 1`
      
          fi
      
          if [ $(echo "$line" |awk '/fail/') ]             ## will check the fail file
          then
          CNT_FAIL=`wc -l $line|tr -s " "|cut -d" " -f2`
          CNT_FAIL=`expr $CNT_FAIL - 1`
      
          fi
          done <log_t.txt
          if [ $CNT_SUCC > 0 ] && [ $CNT_FAIL > 0 ]
          then
                  echo " Fail count = $CNT_FAIL"
                  echo " Success count =  $CNT_SUCC"
                  exit
          fi
      
         echo "waitng for next search..."
         sleep 10
         done
      

      感谢大家的帮助。

      【讨论】:

      • @PrvejKhan 您应该通过单击旁边的复选标记将其标记为最佳答案,这样问题就解决了。
      • 它说:我需要等待接下来的 15 小时。
      【解决方案4】:

      我不认为我做对了,但是你不能区分文件吗?

      也许可以试试:

      #...
      CNT=`expr $CNT - 1`
      if [ $(echo $line | grep -o "fail") ]
      then
          #do something with fail count
      else
          #do something with success count
      fi
      

      【讨论】:

      • 感谢您的快速回复。很抱歉,-o 选项不适用于 sunOs。
      猜你喜欢
      • 1970-01-01
      • 2014-03-20
      • 2011-01-20
      • 2018-05-05
      • 1970-01-01
      • 2015-09-08
      • 2023-02-26
      • 2013-09-25
      • 2016-07-12
      相关资源
      最近更新 更多