Bash脚本处理包含输入字符串的数据

时间:2013-08-14 01:58:58

标签: linux bash

我正在尝试创建一个脚本,该脚本将查找文件夹中包含的所有文件,例如字符串'J34567'并处理它们。现在我可以用我的代码处理文件夹中的所有文件,但是,我的脚本不会只处理包含的字符串,它将处理文件夹中的所有文件。换句话说,即使使用字符串名./bashexample 'J37264'运行脚本,即使没有该字符串名称,它仍将处理所有文件。以下是我的代码:

#!/bin/bash

directory=$(cd `dirname .` && pwd)
tag=$1

echo find: $tag on $directory

find $directory . -type f -exec grep -sl "$tag"  {} \;

for files in $directory/*$tag*
do
    for i in *.std
    do
    /projects/OPSLIB/BCMTOOLS/sumfmt_linux < $i > $i.sum
    done

    for j in *.txt
    do
    egrep "device|Device|\(F\)" $i > $i.fail
    done
    echo $files
done

3 个答案:

答案 0 :(得分:1)

凯文,您可以尝试以下方法:

#!/bin/bash

directory='/home'
tag=$1


for files in $directory/*$tag*
do
    if [ -f $files ]
    then
            #do your stuff
            echo $files
    fi 
done

其中directory是您的目录名称(您也可以将其作为命令行参数传递),tag是您在文件名中查找的搜索词。

答案 1 :(得分:0)

这是我的临时解决方案。请检查它是否符合您的意图。

#!/bin/bash

directory=$(cd `dirname .` && pwd)  ## Should this be just directory=$PWD ?
tag=$1

echo "find: $tag on $directory"

find "$directory" . -type f -exec grep -sl "$tag" {} \;  ## Shouldn't you add -maxdepth 1 ? Are the files listed here the one that should be processed in the loop below instead?

for file in "$directory"/*"$tag"*; do
    if [[ $file == *.std ]]; then
        /projects/OPSLIB/BCMTOOLS/sumfmt_linux < "$file" > "${file}.sum"
    fi

    if [[ $file == *.txt ]]; then
        egrep "device|Device|\(F\)" "$file" > "${file}.fail"
    fi

    echo "$file"
done

更新1

#!/bin/bash

directory=$PWD  ## Change this to another directory if needed.
tag=$1

echo "find: $tag on $directory"

while IFS= read -rd $'\0' file; do
    echo "$file"
    case "$file" in
    *.std)
        /projects/OPSLIB/BCMTOOLS/sumfmt_linux < "$file" > "${file}.sum"
        ;;
    *.txt)
        egrep "device|Device|\(F\)" "$file" > "${file}.fail"
        ;;
    *)
        echo "Unexpected match: $file"
        ;;
    esac
done < <(exec find "$directory" -maxdepth 1 -type f -name "*${tag}*" \( -name '*.std' -or -name '*.txt' \) -print0)  ## Change or remove the maxdepth option as wanted.

更新2

#!/bin/bash

directory=$PWD
tag=$1

echo "find: $tag on $directory"

while IFS= read -rd $'\0' file; do
    echo "$file"
    /projects/OPSLIB/BCMTOOLS/sumfmt_linux < "$file" > "${file}.sum"
done < <(exec find "$directory" . -maxdepth 1 -type f -name "*${tag}*" -name '*.std' -print0)

while IFS= read -rd $'\0' file; do
    echo "$file"
    egrep "device|Device|\(F\)" "$file" > "${file}.fail"
done < <(exec find "$directory" -maxdepth 1 -type f -name "*${tag}*" -name '*.txt' -print0)

答案 2 :(得分:0)

以下脚本将为您提供包含(在文件内部,而不是文件名中)给定模式的文件列表。

#!/bin/bash

directory=`pwd`
tag=$1

for file in $(find "$directory" -type f -exec grep -l "$tag" {} \;); do
    echo $file
    # use $file for further operations
done

.std,.txt,.sum和.fail文件与包含给定模式的文件的相关性是什么?

假设文件名中没有特殊字符,空格等 如果是这样的话应该有助于解决这些问题 How can I escape white space in a bash loop list?
Capturing output of find . -print0 into a bash array


您的脚本中存在多个问题。

无需将以下操作目录设置为当前目录。

directory=$(cd `dirname .` && pwd)
由于$directory.

查找对当前目录执行了两次。

find $directory . -type f -exec grep -sl "$tag"  {} \;

此外,上述find的结果/输出不用于for循环 对于$directory(未考虑的子目录)中的文件运行循环,其文件名具有给定的模式。

for files in $directory/*$tag*

以下for循环将针对当前目录中的所有.txt文件运行,但由于使用了前一循环中的$i,因此只会生成一个输出文件。

for j in *.txt
do
    egrep "device|Device|\(F\)" $i > $i.fail
done