Solved

Convert awk statements to variables

Posted on 2008-10-07
4
1,051 Views
Last Modified: 2013-12-21
I am trying to read in a simple colon delimited datafile (i.e. mysql.accts), parse through it with awk to extract out the variables for the MySQL account username, password and database name.

My awk skills are a bit rusty, but when I kick off the script, I am encountering this error message:

./testme.sh: line 35: username1:mypassword1:database_name1: No such file or directory
./testme.sh: line 36: username1:mypassword1:database_name1: No such file or directory
./testme.sh: line 37: username1:mypassword1:database_name1: No such file or directory

I have attached portions of the code via snippets for reference needs.

mysql.sites datafile...
 
username1:mypassword1:database_name1
username2:mypassword2:database_name2
 
 
Script to read in datafile and extract variables...
 
#!/bin/sh
#
site_list=/home/mysql/sites/mysql.accts
n=1
 
#
# Gather info about each site (one at a time) & extract variables
#
for site in $(awk '{print $1}' < "$site_list" )
do
 
DBUSER=$(awk -F: '{print $1}' < "$site" )
DBPASS=$(awk -F: '{print $2}' < "$site" )
DBNAME=$(awk -F: '{print $3}' < "$site" )
 
echo "$DBUSER -- $DBPASS -- $DBNAME"
 
   let "n += 1"
 
done

Open in new window

0
Comment
Question by:Michael W
  • 2
4 Comments
 
LVL 4

Expert Comment

by:cflong
ID: 22659937
It looks like you're only passing in the first collumn instead of the entire line?  Try building your site variable with collumn $0 (all collumns)
for site in $(awk '{print $0}' < "$site_list" )

Open in new window

0
 
LVL 4

Accepted Solution

by:
cflong earned 500 total points
ID: 22659995
In addition, the reason for the errors is that when you direct stdin with <, shell epects a filename.  Since you have the text in a variable, you can echo that and pipe it to awk
DBUSER=$(echo ${site} | awk -F: '{print $1}' )
DBPASS=$(echo ${site} | awk -F: '{print $2}' )
DBNAME=$(echo ${site} | awk -F: '{print $3}' )

Open in new window

0
 
LVL 14

Expert Comment

by:agriesser
ID: 22660011
Does that meet your requirements?
#!/bin/sh
 
site_list=/home/mysql/sites/mysql.accts
 
while read LINE; do
  DBUSER=$(echo $LINE | awk -F: '{ print $1 }')
  DBPASS=$(echo $LINE | awk -F: '{ print $2 }')
  DBNAME=$(echo $LINE | awk -F: '{ print $3 }')
  echo $DBUSER -- $DBPASS -- $DBNAME
done < $site_list

Open in new window

0
 
LVL 29

Author Closing Comment

by:Michael W
ID: 31503859
You are a god! Thanks!
0

Featured Post

Simplifying Server Workload Migrations

This use case outlines the migration challenges that organizations face and how the Acronis AnyData Engine supports physical-to-physical (P2P), physical-to-virtual (P2V), virtual to physical (V2P), and cross-virtual (V2V) migration scenarios to address these challenges.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

I. Introduction There's an interesting discussion going on now in an Experts Exchange Group — Attachments with no extension (http://www.experts-exchange.com/discussions/210281/Attachments-with-no-extension.html). This reminded me of questions tha…
Utilizing an array to gracefully append to a list of EmailAddresses
Learn how to find files with the shell using the find and locate commands. Use locate to find a needle in a haystack.: With locate, check if the file still exists.: Use find to get the actual location of the file.:
This demo shows you how to set up the containerized NetScaler CPX with NetScaler Management and Analytics System in a non-routable Mesos/Marathon environment for use with Micro-Services applications.

809 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question