awk RS declaration with \n

Hello Team,
input text:

'sysserver(cells/SOL/nodes/bclab130node15/servers/sysserver|server.xml)\nserver2(cells/SOL/nodes/bclab130node15/servers/server2|server.xml)\nfmserver(cells/SOL/nodes/bclab130node15/servers/fmserver|server.xml)\ncmserver(cells/SOL/nodes/bclab130node15/servers/cmserver|server.xml)\nintgserver(cells/SOL/nodes/bclab130node15/servers/intgserver|server.xml)\nitsmserver(cells/SOL/nodes/bclab130node15/servers/itsmserver|server.xml)\nsysserver(cells/SOL/nodes/bclab130node14/servers/sysserver|server.xml)\nserver2(cells/SOL/nodes/bclab130node14/servers/server2|server.xml)\nfmserver(cells/SOL/nodes/bclab130node14/servers/fmserver|server.xml)\ncmserver(cells/SOL/nodes/bclab130node14/servers/cmserver|server.xml)\nintgserver(cells/SOL/nodes/bclab130node14/servers/intgserver|server.xml)\nitsmserver(cells/SOL/nodes/bclab130node14/servers/itsmserver|server.xml)'

here i want to specify the awk input record separator as \n (plain string as in the input text above) and FS as "[\'\(]" and get only the first field of all the lines/records.

Sample output:

sysserver
server2
fmserver
cmserver
intgserver
itsmserver
sysserver
server2
fmserver
cmserver
intgserver
itsmserver

Thanks,
Chandana

---------- Post updated at 02:45 PM ---------- Previous update was at 02:39 PM ----------

the header should be "awk RS declaration with \n"

Try

SQ="'"
sed -e "s/$SQ//g" -e 's/\\n/\n/g; s/([^)]*)//g ' file
sysserver
server2
fmserver
cmserver
intgserver
itsmserver
sysserver
server2
fmserver
cmserver
intgserver
itsmserver
1 Like

Thanks RudiC, that works perfect.

i want to understand

([^)]*

a little more, Would you mind explaining?

Also can this be done with awk, by setting RS built-in variable?

That regex you are citing is missing the final ) . It is looking for a ( , zero or more non- ) , and a closing ) , i.e. it will (hopefully) match and eliminate the trailing parenthesized term in each record.
The reason I did not propose an awk solution is that not all versions allow for multi-char FS nor RS.

This might work in awk :

awk '{gsub (/\\n/, RS); gsub (/\([^)]*\)|\047/, _)} 1' file
1 Like

A convoluted longhand method, OSX 10.12.3, using dash in default terminal.

#!/usr/local/bin/dash
echo 'sysserver(cells/SOL/nodes/bclab130node15/servers/sysserver|server.xml)\nserver2(cells/SOL/nodes/bclab130node15/servers/server2|server.xml)\nfmserver(cells/SOL/nodes/bclab130node15/servers/fmserver|server.xml)\ncmserver(cells/SOL/nodes/bclab130node15/servers/cmserver|server.xml)\nintgserver(cells/SOL/nodes/bclab130node15/servers/intgserver|server.xml)\nitsmserver(cells/SOL/nodes/bclab130node15/servers/itsmserver|server.xml)\nsysserver(cells/SOL/nodes/bclab130node14/servers/sysserver|server.xml)\nserver2(cells/SOL/nodes/bclab130node14/servers/server2|server.xml)\nfmserver(cells/SOL/nodes/bclab130node14/servers/fmserver|server.xml)\ncmserver(cells/SOL/nodes/bclab130node14/servers/cmserver|server.xml)\nintgserver(cells/SOL/nodes/bclab130node14/servers/intgserver|server.xml)\nitsmserver(cells/SOL/nodes/bclab130node14/servers/itsmserver|server.xml)' > /tmp/text
# cat /tmp/text
# Code proper starts here.
while read -r LINE
do
	echo "${LINE%(*}"
done < /tmp/text > /tmp/newtext
# Code end.
cat /tmp/newtext
exit

Results:-

Last login: Tue Mar 14 10:08:07 on ttys000
AMIGA:amiga~> cd Desktop/Code/Shell
AMIGA:amiga~/Desktop/Code/Shell> ./single_line.sh
sysserver
server2
fmserver
cmserver
intgserver
itsmserver
sysserver
server2
fmserver
cmserver
intgserver
itsmserver
AMIGA:amiga~/Desktop/Code/Shell> _
1 Like

Hi Rudic,

Thank you for the solution,
And again , one more query, What does the _ & number 1 mean towards the end?

awk '{gsub (/\\n/, RS); gsub (/\([^)]*\)|\047/, _)} 1' file

Thank you.
Chandana

Each is a knack exploiting awk 's intricacies and default behaviour to save some typing:

  • _ is a previously undefined variable assuming the value "empty string" ("") when used like this, effectively eliminating the matched substring.
  • 1 is a "pattern" that will always yield TRUE and the missing "action" defaults to print .