使用powershell在目录中的所有.log文件中搜索字符串

1hdlvixo  于 2023-02-04  发布在  Shell
关注(0)|答案(3)|浏览(141)

我想读取包含字符串“scp error”的文件夹中今天文件时间戳(即今天的日期yyyymmdd)的所有.log文件。如果条件满足,则将不带扩展名的.log文件的名称移动到新的.txt文件“redrop_files. txt”
这是我目前所尝试的方法

Get-Item File*.log | ForEach-Object {
    $fil = $_.Name;
    
    foreach ($line in Get-Content $fil) {
        if ($line -eq "scp error") {
            $stat = "FAILED"
        }
    }

    if ($stat -eq "FAILED") {
        $errorfile = Get-ChildItem *.log | Rename-Item -NewName { $fil -replace '.log','' }
        Add-Content -Path .\redrop_files.txt "`n" $errorfile
    }
}
webghufk

webghufk1#

你有一个主要问题:你没有把grep的结果存储在任何地方,所以变量f是未定义的。
如果您只需要文件名,那么为什么要将-n与grep一起使用还不清楚;-l似乎更有意义。
因此:

grep --include=\*.log -rlw '/path/' -e "scp error" |\
while read -r f; do
    echo "${f%%.*}"  
done > redrop_files.txt
f4t66c6m

f4t66c6m2#

尝试以下操作,

path=.
while read file; do
  echo ${file%%:*} >> redrop_files.txt
done < <(grep --include=\*.log -rnw $path -e "scp error")
ttygqcqt

ttygqcqt3#

你的代码有一些小错误,还有一些可以改进的地方,比如用switch来读取文件。最大的问题是你实际上是在重命名文件,Rename-Item实际上是在重命名文件。你想做的是把.BaseName属性(没有扩展名的文件名)附加到你的redrop_files.txt文件中。

Get-Item File*.log | ForEach-Object {
    # if this file is not from Today
    if($_.CreationTime -lt [datetime]::Today) {
        # skip it
        return
    }

    $append = switch -Wildcard -File $_.FullName {
        # if the line contains "scp error"
        '*scp error*' {
            # output true
            $true
            # and break this loop, no need to keep checking
            break
        }
    }

    # if the result of the switch loop was true
    if ($append) {
        # append to redrop_files.txt the .BaseName of this file
        Add-Content -Value $_.BaseName -Path .\redrop_files.txt
    }
}

相关问题