The UNIX and Linux Forums  

Go Back   The UNIX and Linux Forums > Top Forums > UNIX for Advanced & Expert Users
Google UNIX.COM


UNIX for Advanced & Expert Users Advanced UNIX and Linux questions go here. Expert-to-Expert.

More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
regular expressions whatever Shell Programming and Scripting 4 05-20-2007 01:30 PM
Help with regular expressions arushunter Shell Programming and Scripting 13 12-23-2006 09:31 PM
regular expressions jack1981 Shell Programming and Scripting 4 07-12-2006 12:10 PM
regular expressions in c++ szzz High Level Programming 2 10-06-2003 07:33 AM
Regular Expressions AresMedia Shell Programming and Scripting 1 08-22-2002 12:55 PM

Reply
 
Submit Tools LinkBack Thread Tools Search this Thread Display Modes
  #1  
Old 05-15-2008
Registered User
 

Join Date: Sep 2006
Posts: 43
Regular Expressions

Hi,
below is a piece of code written by my predecessor at work.
I'm kind of a newbie and am trying to figure out all the regular expressions in this piece of code.
It is really a tough time for me to figure out all the regular expressions.

Please shed some light on the regular expressions in this code

ssh_list() {
typeset userAtHost="$1"
typeset dir="${2-.}"
typeset wild="${3-*}"

info "SSH list: $userAtHost $src $dst"

if [ "$REGION" != prod ] ;then
userAtHost=$LOGNAME@localhost
fi

# Save, disable, and restore the verbose flag - any
# verbose output would look like errors.
typeset verbose="$(set -o |sed -n 's/^verbose *//p')"
set +v
typeset msgs="$(sftp $userAtHost 2>&1 <<EOF
cd $dir
ls
EOF)"
if [ "$verbose" = on ] ;then
set -v
fi

# Strip the "Connecting to host..." line, prompts, blank lines
# and login banners. What's left should only be error messages.
typeset errs="$(echo "$msgs" |
sed -e '/^Connecting to .*\.\.\.$/d' \
-e 's/sftp > //g' \
-e '/^[ ]*$/d' \
-e '/^#/d' \
-e '/^[-dDlbcps][-rwxsStTlL]\{9\}+\{0,1\} /d')"

if [ "$errs" != "" ] ;then
error "$errs"
return 1
fi

echo "$msgs" |
while read line
do
case "$line" in -*\ $wild)
echo ${line##* }
;;esac
done

return 0
}

I'd like some explanation of these lines.... gurus please shed some light.

Thank you for your time.
Ram
Reply With Quote
Forum Sponsor
  #2  
Old 05-16-2008
era era is offline
Herder of Useless Cats
 

Join Date: Mar 2008
Location: /there/is/only/bin/sh
Posts: 3,650
Quote:
Originally Posted by ramky79 View Post
# Save, disable, and restore the verbose flag - any
# verbose output would look like errors.
typeset verbose="$(set -o |sed -n 's/^verbose *//p')"
set +v
This one even has a comment to explain what it does. It disables verbose debugging (disables set -v if set), remembering the previous state of the flag in the verbose variable.

Quote:
# Strip the "Connecting to host..." line, prompts, blank lines
# and login banners. What's left should only be error messages.
typeset errs="$(echo "$msgs" |
sed -e '/^Connecting to .*\.\.\.$/d' \
-e 's/sftp > //g' \
-e '/^[ ]*$/d' \
-e '/^#/d' \
-e '/^[-dDlbcps][-rwxsStTlL]\{9\}+\{0,1\} /d')"
Again, the comments are probably better than any detailed attempt at going through the individual regular expressions. Any "Connecting to ..." line is removed. Any sftp> prompt is removed. Any empty line is removed. Any line beginning with a hash sign is removed. The last one looks vaguely like it's intended to remove directory listing output.

Quote:
echo "$msgs" |
while read line
do
case "$line" in -*\ $wild)
echo ${line##* }
;;esac
done
This prints any line from $msgs which matches a dash, followed by anything, followed by a space, followed by the value of the variable $wild, with everything up to the last space trimmed away. (None of this involves any regular expressions, strictly speaking; both the case statement and the ${var##subst} interpolation work with glob patterns.)

$wild is defined up at the beginning of the function as either positional argument $3 or (if that is empty) an asterisk, which matches anything in glob wildcard notation.
Reply With Quote
  #3  
Old 05-19-2008
Registered User
 

Join Date: Jun 2006
Posts: 164
Mastering Regular Expressions

Get yourself a copy of Mastering Regular Expressions by Jeffrey Friedl. You'll benefit quite a bit from it.

Shawn
Reply With Quote
  #4  
Old 05-21-2008
Registered User
 

Join Date: Sep 2006
Posts: 43
Thank you era and Shawn

The script however works fine on sunSSH
It does not work on an OPEN SSH, I tries to tweak in a little more with the regular expressions... but it still does not help.
Any idea how to overcome this problem.
when I execute the same script on OPEN SSH box here is the error I get.
If I logon interactively from the OPEN SSH box and execute the commands one by one, they work. when they are placed in a script the script doesnot work.any help is appreciated.

INFO: SSH list: user@host outgoing x001_ameint_*.zip
ERROR: #^M
ERROR: #==============================================^M
ERROR: #Bowne Marketing & Business Communications^M
ERROR: #SFTP Server (PCN)^M
ERROR: #==============================================^M
ERROR: #^M
ERROR: ^M
ERROR: sftp> sftp> drwx------ 0 0 0 0 May 21 15:25 .
ERROR: drwx------ 0 0 0 0 Mar 17 11:58 ..
ERROR: drwx------ 0 0 0 0 May 21 15:59 archive
ERROR: -rw------- 0 0 0 4152 May 9 11:44 x001_REPORTS_ameint_AIGODN00857.zip
ERROR: -rw------- 0 0 0 42138973 May 19 14:16 x001_ameint_BP010F0010_00002_003.zip.done
ERROR: -rw------- 0 0 0 377449320 Apr 14 14:20 x001_ameint_BP010F0010_00264_001.zip.done
ERROR: -rw------- 0 0 0 637950 May 21 13:40 x001_ameint_abc.zip
ERROR: -rw------- 0 0 0 408 May 21 13:49 x001_ameint_def.zip
ERROR: -rw------- 0 0 0 408 May 21 13:53 x001_ameint_xyz.zip
ERROR: sftp> Invalid command.^M
ERROR: sftp>

here are my tweaked regular expressions:
ssh_list() {
typeset userAtHost="$1"
typeset dir="${2-.}"
typeset wild="${3-*}"

info "SSH list: $userAtHost $dir $wild"

# Save, disable, and restore the verbose flag - any
# verbose output would look like errors.
typeset verbose="$(set -o |sed -n 's/^verbose *//p')"
set +v
typeset msgs="$(sftp $userAtHost 2>&1 <<EOF
cd $dir
ls -l
EOF)"

echo $msgs > TEXT.dat

if [ "$verbose" = on ] ;then
set -v
fi

# Strip the "Connecting to host..." line, prompts, blank lines
# and login banners. What's left should only be error messages.
typeset errs="$(echo "$msgs" |
sed -e '/^Connecting to .*\.\.\.$/d' \
# -e '/^ERROR: unable to initialize mechanism library [/usr/lib/gss/gl/mech_krb5.so]/d' \
-e '/ERROR: //g' \
-e 's/^$//g' \
-e 's/sftp> //g' \
-e '/^[ ]*$/d' \
-e '/^#/d' \
-e '/^[-dDlbcps][-rwxsStTlL]\{9\}+\{0,1\} /d')"

if [ "$errs" != "" ] ;then
error "$errs"
return 1
fi

echo "$msgs" |
while read line
do
case "$line" in -*\ $wild)
echo ${line##* }
;;esac
done

return 0
}


ssh_sendrecv() {
typeset op="$1"
typeset userAtHost="$2"
typeset src="$3"
typeset dst="$4"

info "SSH transfer: $op $userAtHost $src $dst"

#if [ "$REGION" != prod ] ;then
#userAtHost=$LOGNAME@localhost
#fi


# Save, disable, and restore the verbose flag - any
# verbose output would look like errors.
typeset verbose="$(set -o |sed -n 's/^verbose *//p')"
set +v
typeset msgs="$(sftp $userAtHost 2>&1 <<EOF
$op $src $dst
EOF)"
if [ "$verbose" = on ] ;then
set -v
fi

# Strip the "Connecting to host..." line, prompts, blank lines
# and login banners. What's left should only be error messages.
typeset errs="$(echo "$msgs" |
sed -e '/^Connecting to .*\.\.\.$/d' \
-e 's/^$//g' \
-e 's/sftp> //g' \
-e '/^[ ]*$/d' \
-e '/^#/d')"

if [ "$errs" != "" ] ;then
error "$errs"
return 1
fi

return 0
}
Reply With Quote
Google The UNIX and Linux Forums
Reply

Tags
regex, regular expressions

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes




All times are GMT -7. The time now is 02:03 AM.


Powered by: vBulletin, Copyright ©2000 - 2006, Jelsoft Enterprises Limited.
The UNIX and Linux Forums Content Copyright ©1993-2008. All Rights Reserved.Ad Management by RedTyger Visit The Complex Event Processing Blog

Content Relevant URLs by vBSEO 3.2.0