Parsing Output of a Variable


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Parsing Output of a Variable
# 1  
Old 05-08-2012
Parsing Output of a Variable

i have a log file that contains something similar to this:

Code:
one two three four five six seven eight
nine ten eleven twelve thirteen fourteen
one two three four five six seven eight
nine ten eleven twelve thirteen fourteen
one two three four five six seven eight
nine ten eleven twelve thirteen fourteen
one two three four five six seven eight
nine ten eleven twelve thirteen fourteen
one two three four five six seven eight
nine ten eleven twelve thirteen fourteen

the file is on a remote host.

I take the last 10 lines of this file and i store it to a variable. Then this variable is passed down stream through an agent from the remote host to the central monitoring server.

VARA=$(echo `tail -10 /var/log/arm.log`)

When the lines have been sent back to the central monitoring server, it comes out looking like this:

Code:
one two three four five six seven eight nine ten eleven twelve thirteen fourteen one two three four five six seven eight nine ten eleven twelve 
thirteen fourteen one two three four five six seven eight nine ten eleven twelve thirteen fourteen one two three four five six seven eight nine ten eleven
 twelve thirteen fourteen one two three four five six seven eight
nine ten eleven twelve thirteen fourteen

My question is, how do i "disentangle" these lines, and have them return to the type of line-by-line output one would get with a tail -10?

by the way, the words/characters at the beginning and end of each line is always never the same for each line.

OS: Linux RedHat/Ubuntu/Solaris
Shell: Bash
# 2  
Old 05-08-2012
Quote:
Originally Posted by SkySmart
My question is, how do i "disentangle" these lines, and have them return to the type of line-by-line output one would get with a tail -10?
Code:
VARA="$(tail -10 /var/log/arm.log)"

Notice the double quotes around the subshell, which prevent the shell from evaluating the variables content and the missing "echo", which would do the same, eating away the newlines.

If i may suggest something you didn't ask: don't mix subshell commands "$(...)" and backticks "``". In fact don't use backticks at all! They are only supported for historical purposes and there is no reason at all why one should use them. It is perfectly possible to nest subshells:

Code:
VARA="$(echo $(tail -10 /var/log/arm.log))"

but in your case you better skip the echo altogether and use the version stated above.

I hope this helps.

bakunin
This User Gave Thanks to bakunin For This Post:
# 3  
Old 05-08-2012
Quote:
Originally Posted by bakunin
Code:
VARA="$(tail -10 /var/log/arm.log)"

Notice the double quotes around the subshell, which prevent the shell from evaluating the variables content and the missing "echo", which would do the same, eating away the newlines.

If i may suggest something you didn't ask: don't mix subshell commands "$(...)" and backticks "``". In fact don't use backticks at all! They are only supported for historical purposes and there is no reason at all why one should use them. It is perfectly possible to nest subshells:

Code:
VARA="$(echo $(tail -10 /var/log/arm.log))"

but in your case you better skip the echo altogether and use the version stated above.

I hope this helps.

bakunin

thanks so much. looks like this will work perfectly.

about the ticks.

how would i nest something like this:

VARA=$(for all in `echo fat skinny fine ugly`
do
echo $all
done)
# 4  
Old 05-08-2012
Quote:
Originally Posted by SkySmart
how would i nest something like this:

Code:
VARA=$(for all in `echo fat skinny fine ugly`
do 
echo $all
done)

Please use CODE-tags when posting code or terminal output. It makes the reading much easier and preserves indentation.

To answer your question: you want to split at word boundaries. As the shells default IFS (internal field separator - the character which is used to delimit words) is the space character already you need to do nothing, because the whole "echo" is superfluous:

Code:
VARA=$(for all in fat skinny fine ugly ; do
     echo $all
done)

Notice the difference between:

Code:
for all in fat skinny fine ugly ; do
     echo $all
done

and

Code:
for all in "fat skinny fine ugly" ; do
     echo $all
done

The difference is caused because the double quote is used exactly for this purpose: to tell the shell not to interpret the IFS character in its function but as mere normal character.

I suggest you read the man page of ksh about the IFS character and the IFS special variable.

I hope this helps.

bakunin
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Parsing nsupdate's output

Anybody that's ever used nsupdate knows that it's error management is not very good. I have a wrapper script that when it's got all the information it needs launches the nsupdate command. This is my attempt at parsing the output to help support users quickly know if the command succeded or... (7 Replies)
Discussion started by: maverick72
7 Replies

2. Shell Programming and Scripting

parsing output

Can somebody provide a solution to parse the following; cat /tmp/xxx Name: QUE_REQU (o.mtaseast-o.dmart) (MTPost queue) Number of messages: 66446 (Age 686 min; Size 214 mb) Backlog (messages): 0 (Age 0 min) Name: QUE_REQU... (6 Replies)
Discussion started by: BeefStu
6 Replies

3. Shell Programming and Scripting

Parsing the date output

Hi fellows, I need to define a notification for SSL certificate expiration. My Command output is below: (this is the "Expiration Date") Tue Mar 15 09:30:01 2012 So, at 15th Feb (1 month before the expiration), a notification has to be triggered by a script or sth else. How can i set an... (5 Replies)
Discussion started by: oduth
5 Replies

4. Shell Programming and Scripting

parsing ifconfig output

I'm trying to gather information on the interfaces on a large number of servers. If I run ifconfig I will get: eth0 Link encap:Ethernet HWaddr 00:50:56:A2:27:C1 inet addr:10.145.xxx.xxx Bcast:10.152.45.255 Mask:255.255.254.0 ----- eth1 Link... (2 Replies)
Discussion started by: C0ppert0p
2 Replies

5. UNIX for Dummies Questions & Answers

Parsing a variable

Can someone help me? I have been looking in the archives as I am sure this is very simple to do, but I do not know. I have a variable which sometimes contains a file name and sometimes contains a fully qualified file name. I want to be able to separate the directory from the file name into 2... (3 Replies)
Discussion started by: CAGIRL
3 Replies

6. Shell Programming and Scripting

parsing output of system()

Hi, From the above output of df command I need to parse only 43G (available space) and display it. root@localhost:> df -h /vol1/joy Filesystem Size Used Avail Capacity Mounted on /vol1/joy 180G 137G 43G 76% ... (3 Replies)
Discussion started by: cjjoy
3 Replies

7. Shell Programming and Scripting

parsing a variable

Hi, I want to get an input from user and parse the input. The legal characters allowed in the input are alnum(a-zA-Z0-0), . , - Also the first and las characters must be alnum only. e.g if the input is abc.ghh-sok.com then the script should return correct, and if the input is like... (2 Replies)
Discussion started by: g_rohit7
2 Replies

8. Shell Programming and Scripting

Parsing output

I need to parse the following out put and determine if the USB is a DISK and whether or not it's External. If an HBA line contains "USB" then does the next line contain "DISK" and "External". 0:0,31,0: HBA : (aacraid,1) AAC SCSI 0,0,0: DISK : Adaptec ASR4800SAS Volu0001 ... (6 Replies)
Discussion started by: lochraven
6 Replies

9. Shell Programming and Scripting

parsing output

I have a file that contains the output of the ls -iR command, something like this: ./results: 2504641011 result_1410 2500957642 result_525 2504641012 result_1425 2500957643 result_540 ./tests/1: 2500788755 1 2500788743 1000 ./tests/2: 2500788759 3 2500788758 999 ... (6 Replies)
Discussion started by: looza
6 Replies

10. Shell Programming and Scripting

parsing output from ls command

I have to test the directory name which is obtained from for dir in `ls -l|grep $9 ' i need to check whether it is directory ( if yes, I have to check the first 3 character fo the directory how can I do that? Please help me thanks (3 Replies)
Discussion started by: ajaya
3 Replies
Login or Register to Ask a Question