简体   繁体   中英

Bash Script to process data containing input string

I am trying to create a script that will find all the files in a folder that contain, for example, the string 'J34567' and process them. Right now I can process all the files in the folder with my code, however, my script will not just process the contained string it will process all the files in the folder. In other words once I run the script even with the string name ./bashexample 'J37264' it will still process all the files even without that string name. Here is my code below:

#!/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

Kevin, you could try the following:

#!/bin/bash

directory='/home'
tag=$1


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

where directory is your directory name (you could pass it as a command-line argument too) and tag is the search term you are looking for in a filename.

This is my temporary solution. Please check if it follows your intention.

#!/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

Update 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.

Update 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)

Following script will give you the list of files that contain (inside the file, not in file name) the given pattern.

#!/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

What is the relevance of .std, .txt, .sum and .fail files to the files containing given pattern?

Its assumed there are no special characters, spaces, etc. in file names.
If that is the case following should help working around those.
How can I escape white space in a bash loop list?
Capturing output of find . -print0 into a bash array


There are multiple issues in your script.

Following is not required to set the operating directory to current directory.

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

find is executed twice for the current directory due to $directory and . .

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

Also, result/output of above find is not used in for loop.
For loop is run for files in the $directory (sub directories not considered) with their file name having the given pattern.

for files in $directory/*$tag*

Following for loop will run for all .txt files in current directory, but will result in only one output file due to use of $i from previous loop.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM