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"
RudiC
March 14, 2017, 5:50am
2
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?
RudiC
March 14, 2017, 6:24am
4
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.
RudiC
March 14, 2017, 6:32am
5
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
RudiC
March 16, 2017, 4:57am
8
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
.