컴퓨터활용/유닉스

substring

멜번초이 2012. 10. 18. 00:53

Substrings

Often times a programmer needs to be able to get a substring from a variable at a given position. In unix you can use the exprcommand to do this with the substr parameter. Let's say that we have the text string "5283username$$2384/" and we want to get the text "username". To do this we need to read from position 5 for a length of 8. The parameters for substr are the input string, the starting position, and the length. See the following example: 

#!/bin/sh

INPUT="5283username$$2384/"

USER=`expr substr $INPUT 5 8`

echo "Sub: '$USER'"

Find in a string

Sometimes you need to find text in a string. Maybe you want to list files but print only the text appearing before the ".". So if the filename is asdf.txt, you would want to print only asdf. To do this, you will use expr index, and pass it the string followed by the text for which you are searching. Let's try an example: 

#!/bin/sh

# Get the files:
FILES=`ls -1`

for FILE in $FILES
do
	IDX=`expr index $FILE .`

	if [ "$IDX" == 0 ]; then
		IDX=`expr length $FILE`
	else
		IDX=`expr $IDX - 1`
	fi

	SUB=`expr substr $FILE 1 $IDX`
	echo "Sub File: $SUB"
done

If the substring doesn't exist, 0 is returned. If 0 is returned, we want to make the IDX variable the length of the name so that we just display the whole filename. If a dot is found in the file, we want to subtract 1 from our $IDX variable because we don't want to display the dot. 


To lower/upper case

If you want to transform a string to upper or lower case, you can do so with the unix tr command. Here's a simple example. 

#!/bin/sh

STR_ORIGINAL=aBcDeFgHiJkLmNoP
STR_UPPER=`echo $STR_ORIGINAL | tr a-z A-Z`
STR_LOWER=`echo $STR_ORIGINAL | tr A-Z a-z`

echo "Original: $STR_ORIGINAL"
echo "Upper   : $STR_UPPER"
echo "Lower   : $STR_LOWER"

Editing a file with sed

If you want to edit a file from within your script, you can use the unix sed command. It will take a regular expression and a filename and put the file manipulations to standard output. For instance, let's say that we have a file with two fields "username" and "home directory". All the home directories start with "/home", but what if the admin changes the location of the "/home" directory to "/usr/local/home". We can have sed automatically update our file. Here is the file, save it as testfile2. 

user1 /home/user1
root /home/root
user2 /home/user2
user3 /home/user3

We want our regular expression to search for "/home" and replace it with "/usr/local/home", a search expression is in the following format: "s/find/replace/", where "find" is the string you are searching for and "replace" is what you want to replace it with. Since the / character is a special character, we will need to escape it with a backslash in our find and replace strings. Here is the command we will use to do the file edit: 

$ sed "s/\/home/\/usr\/local\/home/" testfile2 > tmp; cp tmp testfile2 
$ cat testfile2 
user1 /usr/local/home/user1
root /usr/local/home/root
user2 /usr/local/home/user2
user3 /usr/local/home/user3

Notice that we redirect the output of sed to a file named tmp, we then on the same line copy the tmp file over the testfile2 file. We cannot specify testfile2 to be the output since it is also being read from by sed during the command. On the next line we cat the output and you can see the file modifications.


Automating another application

Sometimes we may want to automate another program or script. If the other script expects user input, we may want to write a script to automatically fill in that information. First let's create a simple program that accepts a user name and password: 

#!/bin/sh

#Grab user name:
echo "user: "
read USER

#Grab password:
echo "pass: "
read PWD

if [ "$USER" == "dreamsys" ] && [ "$PWD" == "soft" ]; then
	echo "Login Success!"
else
	echo "Login Failed!"
fi

Save this file as up.sh. Now we need to create a script to automate this script. To do this, all we need to do is output the user name followed by the password to the command line, we will pass these as two parameters: 

#!/bin/sh
USER=$1
PWD=$2

echo $USER
echo $PWD

Now to run this automation script, we simply need to pipe the output to the up.sh script. First we will try to run it with an invalid user and password, then we will try to run it with the correct user and password: 

$ ./auto.sh testuser testpass | ./up.sh
user:
pass:
Login Failed!
$ ./auto.sh dreamsys soft | ./up.sh
user:
pass:
Login Success!

Prev (Search & Sort) | Next (Forums)