How to read the output of a command line by line and pass it as a variable?


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting How to read the output of a command line by line and pass it as a variable?
# 8  
Old 09-27-2017
Please become accustomed to provide decent context info of your problem.

It is always helpful to carefully and detailedly phrase a request, and to support it with system info like OS and shell, related environment (variables, options), preferred tools, adequate (representative) sample input and desired output data and the logics connecting the two including your own attempts at a solution, and, if existent, system (error) messages verbatim, to avoid ambiguities and keep people from guessing.

man bash:
Quote:
Process Substitution
. . . If the <(list) form is used, the file passed as an argument should be read to obtain the output of list.
What do you think is the output of
Code:
course=`nzsql -host -d db -Atc "select course from table group by 1 order by 1;"`

?
# 9  
Old 09-27-2017
Quote:
Originally Posted by Samah
Code:
IFS=''
while read course
do
echo $course
done < <(course=`nzsql -host -d db -Atc "select course from table group by 1 order by 1;"`)

I have no idea how you arrived at this, but if this would work, shell programming woud be a bad idea. ;-)

First: forget about backticks. They are just there for backwards compatibility with a shell which is not in use any more since about 25 years. Just forget they exist.

Second: even if you use backticks, x=`some -command` is a variable assignment. In fact it does: run the command some -command and assign its output to variable x. So, what you did amounts to:

Code:
while read line ; do
     command
done < x="blabla"

which is obviously not what you intended. You do it the same way i showed you with sed: by pipelining it like this:

Code:
command |\
while read line ; do
     other_command "$line"
done

The pipeline can have more than one part, so this would also be possible:

Code:
command1 |\
command2 |\
command3 |\
.... |\
while read line ; do
     other_command "$line"
done

This runs command1, then pours its output into command2, the output of command2 into command3 and so forth, until the output of the last command is poured into the loop, which reads it line by line and processes it.

I am sure you can now construct your own script with ease, no?

By the way: if you want to process lines like you do stay generally away from for-loops. While-loops are a lot more flexible when it comes to parsing input, even when word-splitting is involved.

Suppose you have a file (or process output, which is effectively the same) of this structure:

Code:
line1-word1 line1-word2 line1-word3
line2-word1 line2-word2 line2-word3
line3-word1 line3-word2 line3-word3
line4-word1 line4-word2 line4-word3

and you want to process the second word of every line ("line1-word2", "line2.word2", etc.) then this will do it:

Code:
InFile="/path/to/input"
secondword=""

while read junk secondword junk ; do
     echo "this is $word"
done <"$InFile"

Try it out. You could do that with some gymnastics and a for-loop too, but this is IMHO a lot easier to write and a lot easier to read and understand.

I hope this helps.

bakunin
# 10  
Old 09-27-2017
Quote:
Originally Posted by RudiC
Please become accustomed to provide decent context info of your problem.

It is always helpful to carefully and detailedly phrase a request, and to support it with system info like OS and shell, related environment (variables, options), preferred tools, adequate (representative) sample input and desired output data and the logics connecting the two including your own attempts at a solution, and, if existent, system (error) messages verbatim, to avoid ambiguities and keep people from guessing.

man bash:

What do you think is the output of
Code:
course=`nzsql -host -d db -Atc "select course from table group by 1 order by 1;"`

?
Sure RudiC,will make a note of it.

---------- Post updated at 03:15 PM ---------- Previous update was at 03:13 PM ----------

Quote:
Originally Posted by bakunin
I have no idea how you arrived at this, but if this would work, shell programming woud be a bad idea. ;-)

First: forget about backticks. They are just there for backwards compatibility with a shell which is not in use any more since about 25 years. Just forget they exist.

Second: even if you use backticks, x=`some -command` is a variable assignment. In fact it does: run the command some -command and assign its output to variable x. So, what you did amounts to:

Code:
while read line ; do
     command
done < x="blabla"

which is obviously not what you intended. You do it the same way i showed you with sed: by pipelining it like this:

Code:
command |\
while read line ; do
     other_command "$line"
done

The pipeline can have more than one part, so this would also be possible:

Code:
command1 |\
command2 |\
command3 |\
.... |\
while read line ; do
     other_command "$line"
done

This runs command1, then pours its output into command2, the output of command2 into command3 and so forth, until the output of the last command is poured into the loop, which reads it line by line and processes it.

I am sure you can now construct your own script with ease, no?

By the way: if you want to process lines like you do stay generally away from for-loops. While-loops are a lot more flexible when it comes to parsing input, even when word-splitting is involved.

Suppose you have a file (or process output, which is effectively the same) of this structure:

Code:
line1-word1 line1-word2 line1-word3
line2-word1 line2-word2 line2-word3
line3-word1 line3-word2 line3-word3
line4-word1 line4-word2 line4-word3

and you want to process the second word of every line ("line1-word2", "line2.word2", etc.) then this will do it:

Code:
InFile="/path/to/input"
secondword=""

while read junk secondword junk ; do
     echo "this is $word"
done <"$InFile"

Try it out. You could do that with some gymnastics and a for-loop too, but this is IMHO a lot easier to write and a lot easier to read and understand.

I hope this helps.

bakunin
Bakunin, Thanks a ton for your detailed explanation.I will try to construct my script now!

I am facing one more challenge here, for time being i have passed the variable from a file line by line and it is working fine but i have some 2k names in the file so i need to make checkpoint at 100 each time and then start executing the steps till end of the file. For example, my script should consider the first 100 names line by line,passing it as a parameter and execute the code. and the when i execute it next time it should skip the first 100 lines and pick it from 101 line till 200..

Thanks again!
# 11  
Old 09-27-2017
There are umpteen possible approaches to your last question, e.g. using a counter in the loop, splitting the input file, using nested loops, mayhap a dedicated script.
Why don't you present your script and input data, and we'll discuss?
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

Get an output of lines in pattern 1st line then 10th line then 11th line then 20th line and so on.

Input file: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 (6 Replies)
Discussion started by: Sagar Singh
6 Replies

2. Shell Programming and Scripting

Ksh: Read line parse characters into variable and remove the line if the date is older than 50 days

I have a test file with the following format, It contains the username_date when the user was locked from the database. $ cat lockedusers.txt TEST1_21062016 TEST2_02122015 TEST3_01032016 TEST4_01042016 I'm writing a ksh script and faced with this difficult scenario for my... (11 Replies)
Discussion started by: humble_learner
11 Replies

3. Shell Programming and Scripting

How to read a two files, line by line in UNIX script and how to assign shell variable to awk ..?

Input are file and file1 file contains store.bal product.bal category.bal admin.bal file1 contains flip.store.bal ::FFFF:BADC:CD28,::FFFF:558E:11C5,6,8,2,1,::FFFF:81C8:CA8B,::FFFF:BADC:CD28,1,0,0,0,::FFFF:81C8:11C5,2,1,0,0,::FFFF:81DC:3111,1,0,1,0 store.bal.... (2 Replies)
Discussion started by: veeruasu
2 Replies

4. Shell Programming and Scripting

Passing the value of variable which is read from command line in called script

Hi, I am calling a Perl script in my shell script. When Perl script is executed it asks for a answer to be entered by user from terminal. How can i pass that value from my shell script ?? I know I can change perl script to default the answer but i dont have access to do that so only option i... (5 Replies)
Discussion started by: varun22486
5 Replies

5. Shell Programming and Scripting

read line and run a different command according to the output

Hi. I'm trying to write a script that reads a line on a file and runs a different command for a different line output. For example, if it finds the word "Kuku" on the line it sends mail to Kuku@kuku.com. Otherwise, it sends mail to Lulu@lulu.com. TIA. (2 Replies)
Discussion started by: Doojek9
2 Replies

6. Shell Programming and Scripting

How to read a file line by line and store it in a variable to execute a program ?

Hello, I am quite new in shell scripting and I would like to write a little scritp to run a program on some parameters files. all my parameters files are in the same directory, so pick them up with ls *.para >>dirafter that I have a dir file like that: param1.para param2.para etc... I... (2 Replies)
Discussion started by: shadok
2 Replies

7. Shell Programming and Scripting

Blank as variable/output when run from command line

When I run this: PDHDURL=`/usr/bin/curl --silent http://www.phdcomics.com/comics.php | /usr/bin/grep -o http://www.phdcomics.com/comics/archive/.*.gif | head -1` echo -e "$PHDURL" It is totally blank. However, when I just run it from the terminal: /usr/bin/curl --silent... (2 Replies)
Discussion started by: killer54291
2 Replies

8. Shell Programming and Scripting

Pass command line argument to variable

Hi, I had written a shell script to pass command line argument to variable in a function. Here is my code: main if ; then .$1 echo $1 get_input_file else echo "input file $1 is not available" fi get_input_file() { FILE = "$1" echo $FILE } (10 Replies)
Discussion started by: Poonamol
10 Replies

9. UNIX for Dummies Questions & Answers

Assigning the output of a command to a variable, where there may be >1 line returned?

Hello I am using unix CLI commands for the Synergy CM software. The command basically searches for a folder ID and returns the names of the projects the folder sits in. The result is assigned to a variable: FIND_USE=`ccm folder -fu -u -f "%name"-"%version" ${FOLDER_ID}` When the command... (6 Replies)
Discussion started by: Glyn_Mo
6 Replies

10. Shell Programming and Scripting

read a file as input and pass each line to another script

Hi, I am trying to write a ftp script which will read a file for filenames and ftp those files to another server. Here's my ftp script, but it's scanning the current directory for file names. My question is how can I pass multiple files (these files will have the name of data files that need to... (0 Replies)
Discussion started by: sajjad02
0 Replies
Login or Register to Ask a Question