achiever202
achiever202

Reputation: 123

How to search a specific column in a file for a string in shell?

I am learning shell scripting. I wrote a script that indexes all the files and folders in the current working directory in the following tab separated format,

Path Filename File/Directory Last Modified date Size Textfile(Y/N)

for example, two lines in my file 'index.txt' are,

home/Desktop/C    C    d    Thu Jan 16 01:23:57 PST 2014    4 KB    N
home/Desktop/C/100novels.txt    100novels.txt    f    Thu Mar 14 06:04:06 PST 2013    0 KB Y

Now, i want to write another script to search for files from the previous file that takes in command line parameters, the file name. And also optional parameters as -dir (if to search only for directories), -date DATE (for last modified date), -t (for text files only) etc. How to go about this ?

I know the grep command that searches in a file for a string, but suppose i entered a file name, it would search the entire file for the file name instead of searching only the filename column. How do i do this? Is there any other command to achieve this ?

Upvotes: 1

Views: 13242

Answers (2)

glenn jackman
glenn jackman

Reputation: 246754

"i want to search in a speific column for a particular string... how to do that ?"

For example, to search for directories:

awk -F '\t' '$3 == "d"' filename

You can also search by regular expression or substring matching. Please post further questions as you learn.

Single quotes prevent variable substitution (and other forms of expansion) -- see the bash manual. So you have to pass the value by other means:

awk -F'\t' -v s="$search_file" '$2 == s' ./index.txt > final.txt

or, use double quotes, more fragile and harder to read IMO

awk -F'\t' "\$2 == \"$search_file\"" ./index.txt > final.txt

Also, you don't mix single and double quotes. Pick one or the other, depending on the functionality you need.

Upvotes: 2

dacuna
dacuna

Reputation: 1096

You can doit using the command awk. For example to print the first column of a file using awk:

awk -F ":" '{print $1}' /etc/passwd 

(note that the -F flag is to choose a field separator for the columns, in your case you don't need it). Then you can use grep to filter in that column. Good luck!

Upvotes: 0

Related Questions