Read lines from File in Bash and parse words into

2019-02-23 11:32发布

I have a bash script which reads lines from a text file with 4 columns(no headers). The number of lines can be a maximum of 4 lines or less. The words in each line are separated by SPACE character.

ab@from.com   xyz@to.com;abc@to.com   Sub1   MailBody1
xv@from.com   abc@to.com;poy@to.com   Sub2   MailBody2
mb@from.com   gmc@to.com;abc@to.com   Sub3   MailBody3
yt@from.com   gqw@to.com;xyz@to.com   Sub4   MailBody4

Currently, I am parsing the file and after getting each line, I am storing each word in every line into a variable and calling mailx four times. Wondering if is there is an elegant awk/sed solution to the below mentioned logic.

  • find total number of lines
  • while read $line, store each line in a variable
  • parse each line as i=( $line1 ), j=( $line2 ) etc
  • get values from each line as ${i[0]}, ${i[1]}, ${i[2]} and ${i[3]} etc
  • call mailx -s ${i[2]} -t ${i[1]} -r ${i[0]} < ${i[3]}
  • parse next line and call mailx
  • do this until no more lines or max 4 lines have been reached

Do awk or sed provide an elegant solution to the above iterating/looping logic?

标签: bash sed mailx
2条回答
你好瞎i
2楼-- · 2019-02-23 11:48

The above while loop works well as a simple alternative to sed and awk if you have a lot of control over how to display the lines of text in a file. the read command can use a specified delimiter as well, using the -d flag.

Another simple example:

I had used mysql to grab a list of users and hosts, putting it into a file /tmp/userlist with text as shown:

user1 host1
user2 host2
user3 host3

I passed these variables into a mysql command to get grant info for these users and hosts and append to /tmp/grantlist:

cat /tmp/userlist | while read user hostname;
do
  echo -e "\n\nGrabbing user $user for host $hostname..."
  mysql -u root -h "localhost" -e "SHOW GRANTS FOR '$user'@$hostname" >> /tmp/grantlist
done
查看更多
兄弟一词,经得起流年.
3楼-- · 2019-02-23 11:53

Give this a shot:

head -n 4 mail.txt | while read from to subject body; do
    mailx -s "$subject" -t "$to" -r "$from" <<< "$body"
done
  • head -n 4 reads up to four lines from your text file.
  • read can read multiple variables from one line, so we can use named variables for readability.
  • <<< is probably what you want for the redirection, rather than <. Probably.
查看更多
登录 后发表回答