Reading a file line by line and print required lines based on pattern


 
Thread Tools Search this Thread
Top Forums UNIX for Beginners Questions & Answers Reading a file line by line and print required lines based on pattern
# 1  
Old 10-30-2019
Reading a file line by line and print required lines based on pattern

Hi All,

i want to write a shell script read below file line by line and want to exclude the lines which contains empty value for MOUNTPOINT field.

i am using centos 7 Operating system.

want to read below file.

Code:
[root@matilda final]# cat /tmp/d5
NAME="/dev/sda" TYPE="disk" SIZE="60G" OWNER="root" GROUP="disk" MODE="brw-rw----" PKNAME="" MOUNTPOINT=""
NAME="/dev/sda1" TYPE="part" SIZE="500M" OWNER="root" GROUP="disk" MODE="brw-rw----" PKNAME="/dev/sda" MOUNTPOINT="/boot"
NAME="/dev/sda2" TYPE="part" SIZE="29.5G" OWNER="root" GROUP="disk" MODE="brw-rw----" PKNAME="/dev/sda" MOUNTPOINT=""
NAME="/dev/mapper/centos-root" TYPE="lvm" SIZE="56.5G" OWNER="root" GROUP="disk" MODE="brw-rw----" PKNAME="/dev/sda2" MOUNTPOINT="/"
NAME="/dev/mapper/centos-swap" TYPE="lvm" SIZE="3G" OWNER="root" GROUP="disk" MODE="brw-rw----" PKNAME="/dev/sda2" MOUNTPOINT="[SWAP]"
NAME="/dev/sda3" TYPE="part" SIZE="30G" OWNER="root" GROUP="disk" MODE="brw-rw----" PKNAME="/dev/sda" MOUNTPOINT=""
NAME="/dev/mapper/centos-root" TYPE="lvm" SIZE="56.5G" OWNER="root" GROUP="disk" MODE="brw-rw----" PKNAME="/dev/sda3" MOUNTPOINT="/"
NAME="/dev/sr0" TYPE="rom" SIZE="603M" OWNER="root" GROUP="cdrom" MODE="brw-rw----" PKNAME="" MOUNTPOINT=""

Desired output :

Code:
Mountpoint:"/boot"
 Type:"part"

Mountpoint:"/"
 Type:"lvm"
Mountpoint:"[SWAP]"
 Type:"lvm"

Mountpoint:"/"
 Type:"lvm"

i am using below shell script , but i am unable to ignore the lines which contains Mountpoint value is empty.


My Script :
Code:
#!/bin/bash
FILE=/tmp/d5
while read LINE; do
mountpoint=$(echo "$LINE" | awk -F " " '{print$8}'|awk -F "=" '{print$2}')

disk=$(echo "$LINE" | awk -F " " '{print$1}'|awk -F "=" '{print$2}')
Type=$(echo "$LINE" | awk -F " " '{print$2}'|awk -F "=" '{print$2}')

if [ "$mountpoint" != "" ];then

      echo -e "Mountpoint:$mountpoint \n Type:$Type"

fi
done < $FILE

i am getting below output ;

Code:
Mountpoint:""
 Type:"disk"
Mountpoint:"/boot"
 Type:"part"
Mountpoint:""
 Type:"part"
Mountpoint:"/"
 Type:"lvm"
Mountpoint:"[SWAP]"
 Type:"lvm"
Mountpoint:""
 Type:"part"
Mountpoint:"/"
 Type:"lvm"
Mountpoint:""
 Type:"rom"

Can someone please help me on this issue.

Last edited by jim mcnamara; 10-30-2019 at 06:34 PM..
# 2  
Old 10-30-2019
That mountpoint variable is not empty but holds "". Change the if test to
Code:
if [ "$mountpoint" != \"\" ];

and it will fly...


EDIT: BTW, running awk 6 times per line to extract some variables is not the most efficient way to go. The read builtin command can split a line to be read into variables, like
Code:
read NAME TYPE SIZE OWNER GROUP MODE PKNAME MOUNTPOINT

, which will fill all those variables, given the input file is consistently well behaved. Get rid of the prefixes before the equals signs with shell "parameter expansion".
Or, adjust IFS and read the values immediately:
Code:
IFS="$IFS="
read _ NAME _ TYPE _ SIZE _ OWNER _ GROUP _ MODE _ PKNAME _ MOUNTPOINT

The _ is a dummy variable to be discarded.
With a file structure as presented, and using a recent bash with "process substitution", you could do even
Code:
while read LINE
  do    . <(echo $LINE)
        if [ "$MOUNTPOINT" ]
          then  echo -e "Mountpoint:$MOUNTPOINT \n Type:$TYPE"
        fi
  done < $FILE
Mountpoint:/boot 
 Type:part
Mountpoint:/ 
 Type:lvm
Mountpoint:[SWAP] 
 Type:lvm
Mountpoint:/ 
 Type:lvm

, i.e source each line to have it assign all the variables miraculously automatically...

Last edited by RudiC; 10-30-2019 at 08:03 PM..
These 2 Users Gave Thanks to RudiC For This Post:
# 3  
Old 10-31-2019
I wonder if . <(echo $LINE) does the same as eval $LINE.?
# 4  
Old 10-31-2019
In fact I get a different (wrong) result in bash-3 for
. <(echo $LINE
and identical (correct) results in all shells for
. <(echo "$LINE"
eval $LINE
eval "$LINE"

# 5  
Old 10-31-2019
Thanks all for sharing the information.

now i am able to get the required output.
Output :

mounted:"/boot" type:"part" file_system:"/dev/sda1"

mounted:"/" type:"lvm" file_system:"/dev/mapper/centos-root"

mounted:"[SWAP]" type:"lvm" file_system:"/dev/mapper/centos-swap"

mounted:"/" type:"lvm" file_system:"/dev/mapper/centos-root"


below is my df -h output
which is stored in
FILE1=/tmp/d4 file as below

Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 176M 1.7G 10% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root 57G 48G 9.3G 84% /
/dev/sda1 497M 217M 281M 44% /boot
tmpfs 379M 0 379M 0% /run/user/0

simultaneously i want to read another file which contains df -h ouput. and want to compare the Filesystem field with $NAME field in above ouput
if both are same then i want to add remaining fields of df -h output to current ouput

Example :
if file_system:"/dev/mapper/centos-root" is equal to df -h ouput "/dev/mapper/centos-root"

then for the current ouput
mounted:"/" type:"lvm" file_system:"/dev/mapper/centos-root" i want to add remaining df -h field output.

desired output :
mounted:"/" type:"lvm" file_system:"/dev/mapper/centos-root" Avail:"9.3G " Use%:"84%"

used below script :

#!/bin/bash
FILE=/tmp/d5
FILE1=/tmp/d4
while read LINE;
do . <(echo $LINE)
if [ "$MOUNTPOINT" != "" ]

mounted=$MOUNTPOINT

file_system=$NAME
type=$TYPE


while read LINE1;
do . <(echo $LINE1)

File_System=$Filesystem
if [ "$MOUNTPOINT" == "$Filesystem" ];then

echo -e "mounted:$MOUNTPOINT type:$type file_system:$Filesystem avail:$Avail \n"

done < FILE1

fi
fi
done < $FILE


./zzz: line 22: syntax error near unexpected token `done'
./zzz: line 22: `done < FILE1'

Last edited by balu1234; 10-31-2019 at 01:43 PM..
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

Match Pattern and print pattern and multiple lines into one line

Hello Experts , require help . See below output: File inputs ------------------------------------------ Server Host = mike id rl images allocated last updated density vimages expiration last read <------- STATUS ------->... (4 Replies)
Discussion started by: tigerhills
4 Replies

3. Shell Programming and Scripting

Print lines based on line number and specified condition

Hi, I have a file like below. 1,2,3,4,5,6,7,8,9I would like to print or copied to a file based of line count in perl If I gave a condition 1 to 3 then it should iterate over above file and print 1 to 3 and then again 1 to 3 etc. output should be 1,2,3 4,5,6 7,8,9 (10 Replies)
Discussion started by: Anjan1
10 Replies

4. Shell Programming and Scripting

Reading line by line from live log file using while loop and considering only those lines start from

Hi, I want to read a live log file line by line and considering those line which start from time stamp; Below code I am using, which read line but throws an exception when comparing line that does not contain error code tail -F /logs/COMMON-ERROR.log | while read myline; do... (2 Replies)
Discussion started by: ketanraut
2 Replies

5. Shell Programming and Scripting

awk print pattern match line and following lines

Data: Pattern Data Data Data Data Data Data Data Data Data ... With awk, how do I print the pattern matching line, then the subsequent lines following the pattern matching line. Varying number of lines following the pattern matching line. (9 Replies)
Discussion started by: dmesserly
9 Replies

6. Shell Programming and Scripting

Sed print range of lines between line number and pattern

Hi, I have a file as below This is the line one This is the line two <\XMLTAG> This is the line three This is the line four <\XMLTAG> Output of the SED command need to be as below. This is the line one This is the line two <\XMLTAG> Please do the need to needful to... (4 Replies)
Discussion started by: RMN
4 Replies

7. Shell Programming and Scripting

grep based on pattern in a line and print the column before that

$ cat file.log Message Number = : Sending message 10:50:16^|^reqhdr.dummyid^=^02^|^reqhdr.timezone^=^GMT+05:30^|^DUMMYREQUEST^=^BH||||||||||||||||||$BD|OL|C|V||DummyAcctNo|02||24/12/2011|ST_DDM|DDM||||||||reqUUID110612105016$BT||||||||||||||||||$] Length I have the above line in the... (4 Replies)
Discussion started by: kalidass
4 Replies

8. Shell Programming and Scripting

Grep the word from pattern line and update in subsequent lines till next pattern line reached

Hi, I have got the below requirement. please suggest. I have a file like, Processing Item is: /data/ing/cfg2/abc.txt /data/ing/cfg3/bgc.txt Processing Item is: /data/cmd/for2/ght.txt /data/kernal/config.klgt.txt I want to process the above file to get the output file like, ... (5 Replies)
Discussion started by: rbalaj16
5 Replies

9. Shell Programming and Scripting

print range of lines matching pattern and previous line

Hi all, on Solaris 10, I'd like to print a range of lines starting at pattern but also including the very first line before pattern. the following doesn't print the range starting at pattern and going down to the end of file: cat <my file> | sed -n -e '/<pattern>{x;p;}/' I need to include the... (1 Reply)
Discussion started by: siriche
1 Replies

10. Shell Programming and Scripting

Help required on joining one line above & below to the pattern matched string line.

Hi Experts, Help needed on joining one line above & below to the pattern matched string line. The input file, required output is mentioned below Input file ABCD DEFG5 42.0.1-63.38.31 KKKK iokl IP Connection Available ABCD DEFG5 42.0.1-63.38.31 ... (7 Replies)
Discussion started by: krao
7 Replies
Login or Register to Ask a Question