How to search a filename stored in a variable using a pattern?


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting How to search a filename stored in a variable using a pattern?
# 1  
Old 07-24-2013
How to search a filename stored in a variable using a pattern?

hi,

i have a variable which contains some file names delimited by a single space.
Code:
FNAME="s1.txt s2.lst s3.cvs s4.lst"

i have another variable that contains a pattern
Code:
FILE_PATTERN="*.lst"

i want to take the filenames from FNAME variable and assign each file name in to an array say
for example:- *.lst will match two files that are s2.lst and s4.lst, so i want to assign s2.lst and s4.lst to a array
Code:
FILE[0]="s2.lst"
FILE[1]="s4.lst"

can anyone say how can i do the above.?

Thanks
# 2  
Old 07-24-2013
Made a slight modification to use variable EXTENSION that excludes the *

Code:
FNAME="s1.txt s2.lst s3.cvs s4.lst"
#FILE_PATTERN="*.lst"
EXTENSION=".lst"
i=0
echo $FNAME | tr " " "\n"  |grep $EXTENSION | while read LINE
do
 FILE[$i]=$LINE
 i=$(expr $i + 1)
done

# 3  
Old 07-24-2013
thanks for the code.

but in the above code, the array FILE[] is not accessible outside the while loop.
when i try to print FILE[0] and FILE[1] outside the while loop, it shows empty values.
# 4  
Old 07-24-2013
Try displaying the values using below commands.

Code:
echo ${FILE[0]}
echo ${FILE[1]}

You may loop through the index to print all the elements.
# 5  
Old 07-24-2013
Yet another way of doing it:

Code:
FNAME="s1.txt s2.lst s3.cvs s4.lst"

FILE_PATTERN="lst"
i=0
for f in $FNAME;do
	[ ${f##*.} = $FILE_PATTERN ] && FILE[$i]=$f && i=$((i+1)) 
done

# 6  
Old 07-24-2013
Edited to include ( ) at start and end

Code:
$ array=($(echo $FNAME | awk -F[" "] -v var=$(echo $FILE_PATTERN | sed -e 's/*\.//g') '{ORS=" "}{for(i=1;i<=NF;i++){if($i ~ var) print $i}}'))
$ echo ${array[0]}
s2.lst
$ echo ${array[1]}
s4.lst


Last edited by rajamadhavan; 07-24-2013 at 05:50 AM..
# 7  
Old 07-24-2013
Quote:
Originally Posted by rajamadhavan
Edited to include ( ) at start and end

Code:
$ array=($(echo $FNAME | awk -F[" "] -v var=$(echo $FILE_PATTERN | sed -e 's/*\.//g') '
{ORS=" "}{for(i=1;i<=NF;i++){if($i ~ var) print $i}}'))

Your solution is extremely ill-conceived.

Deleting *. utterly changes the meaning of the pattern. A filename that does not match *.ext could match ext, and, vice versa, one that did match could then not match.

It gets worse. sh pattern matching notation and regular expressions are not equivalent. One is not even a subset of the other. Taking sh pattern notation and using it as an AWK regular expression makes no sense.

The parameter expansions of $FNAME and $FILE_PATTERN could trigger pathname expansion (aka file globbing). Unintended globbing of FNAME could lead to items in the output that were not part of the FNAME list. Unintended globbing of FILE_PATTERN could drastically alter the value of var.

The bracketed expression in the awk option argument -F[" "] is also vulnerable to pathname expansion, although the result of such an expansion is identical to the pattern itself, which would alter nothing. Still, it's good to be aware that it could happen.

The echo statements can yield inaccurate output if the argument looks like an option.

Your code may yield correct output in some cases, but it won't work generally.

A correct approach which is also much simpler and more efficient:
Code:
a=(`
    set -f
    for i in $FNAME; do
        [[ $i == $FILE_PATTERN ]] && printf ' %s' "$i"
    done
`)

For those who prefer the less-readable one-liner format:
Code:
 a=(`set -f; for i in $FNAME; do [[ "$i" == $FILE_PATTERN ]] && printf ' %s' "$i"; done`)

Using case $i in $FILE_PATTERN) ... ;; esac is more portable, but any shell that supports that array syntax also supports [[ ... ]].

Regards,
Alister

Last edited by alister; 07-24-2013 at 04:52 PM..
This User Gave Thanks to alister For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

awk -Search pattern through Variable

Hello, We have wrote shell script for multiple file name search pattern. file format: <numner>_<20180809>.txt starting with single number and ending with 8 digits number Command: awk -v string="12_1234" -v serch="^+_+$" "BEGIN{ if (string ~/serch$/) print string }" If sting matches... (4 Replies)
Discussion started by: koti_rama
4 Replies

2. Shell Programming and Scripting

awk variable search and line count between variable-search pattern

Input: |Running the Rsync|Sun Oct 16 22:48:01 BST 2016 |End of the Rsync|Sun Oct 16 22:49:54 BST 2016 |Running the Rsync|Sun Oct 16 22:54:01 BST 2016 |End of the Rsync|Sun Oct 16 22:55:45 BST 2016 |Running the Rsync|Sun Oct 16 23:00:02 BST 2016 |End of the Rsync|Sun Oct 16 23:01:44 BST 2016... (4 Replies)
Discussion started by: busyboy
4 Replies

3. Shell Programming and Scripting

Search if file exists for a file pattern stored in array

Hi experts, I have two arrays one has the file paths to be searched in , and the other has the files to be serached.For eg searchfile.dat will have abc303 xyz123 i have to search for files that could be abc303*.dat or for that matter any extension . abc303*.dat.gz The following code... (2 Replies)
Discussion started by: 100bees
2 Replies

4. UNIX for Dummies Questions & Answers

Assigning matched pattern within filename to variable

I am writing a bash script where I use two types of files that both contain a numerical pattern of the type 123.4567 (always groups of three and four digits separated by period) within their filenames. I need to assign the numerical patterns of these filenames to variables (inside a for loop),... (6 Replies)
Discussion started by: Mauve
6 Replies

5. Shell Programming and Scripting

[Solved] Replace extension of filename stored in a variable

Hi there, I have a small question (most like a true beginners question :) ). In a script I have a filename stored in variable (vFile). Through the an input parameter this variable gets its value (for instance cookie.txt). Two new variables are created with the value of vFile, but with a... (2 Replies)
Discussion started by: rberkers
2 Replies

6. Shell Programming and Scripting

PERL : pattern matching a string stored in a variable

I have two variables, my $filename = "abc_yyyy_mm_dd.txt"; my $filename1 = " abc_2011_11_07.txt"; I need to perform some operations after checking if $filename has $filename1 in it i have used the below code, if($filename =~ /^$filename1/) { ---- -- } (2 Replies)
Discussion started by: irudayaraj
2 Replies

7. Shell Programming and Scripting

search the pattern in a file and replace with variable already defined previously in csh

I want to replace a certain pattern with the variable already defined. e.g. set path_verilog = /home/priya/bin/verilogfile my file contents are : verilog new verilog is defined here verilog_path_comes I am using the below command sed 's/verilog_path_comes/'$path_verilog'/g' <filename>... (2 Replies)
Discussion started by: nehashine
2 Replies

8. Shell Programming and Scripting

How to assign the Pattern Search string as Input Variable

guys, I need to know how to assing pattern matched string as an input command variable. Here it goes' My script is something like this. ./routing.sh <Server> <enable|disable> ## This Script takes an input <Server> variable from this line of the script ## echo $1 | egrep... (1 Reply)
Discussion started by: raghunsi
1 Replies

9. Shell Programming and Scripting

Search for awk pattern in unix env variable

For a Script I need to detemine which field of the unix environment variable SHLIB_PATH has the WALTDB entry. export SHLIB_PATH=/usr/user5/WALTDB/oracle/product/10.2.0/lib32:/usr/TZD/bin.wdad/mug/oracle/lib: echo $SHLIB_PATH | awk -F: '{ print $1 }' Shure gives me the first entry, but... (6 Replies)
Discussion started by: sdohn
6 Replies

10. Shell Programming and Scripting

AWK: pattern not properly stored in variable?

Hey there, I have a table of contents file of the form 1 Title1 1.1 Subtitle1 1.1.1 Subsubtitle1 1.1.2 Subsubtitle2 ... and want to count the number of dots in the first field to find out the level of the section. I use the gsub function for the job, which works if I pass the pattern... (2 Replies)
Discussion started by: herrsimon
2 Replies
Login or Register to Ask a Question