1. Getting timestamp of a file creation:
#!/bin/sh FILE_TO_CHECK="/logs/mylog.log" FILE_DATE=`ls -lrt ${FILE_TO_CHECK} | tr -s " " | cut -d" " -f6-8` CONVERTED_FILE_DATE=$(date -d "${FILE_DATE}" '+%Y%m%d') echo ${CONVERTED_FILE_DATE} |
2. Comparing timestamps in format HHMM (like: 1201 or 0901, etc.) with NOW
We can get time (HHMM) part of the date and compare it to another timestamp as integer values. We just need to make sure that leading 0s are processed properly (for timestamps like 0000-0959).
This can be achieved by the following code: echo 0020 | sed 's/^0*//'.
Returned result will be: 20
For those, not familiar with regular expressions, the expression provided for sed means - replace one or more 0s at the beginning of the line with empty string - i.e. delete leading 0s.
#!/bin/sh NEEDED_TIME_HHMM=0001 CURR_DATETIME=`date '+%Y%m%d%H%M%S'` CURR_TIME_HHMM=`date '+%H%M'` CURR_DATE=`date '+%Y%m%d'` if [[ $(echo ${NEEDED_TIME_HHMM} | sed 's/^0*//') -le \ $(echo ${CURR_TIME_HHMM} | sed 's/^0*//') ]] then echo “${NEEDED_TIME_HHMM} le ${CURR_TIME_HHMM}” else echo “NOT ${NEEDED_TIME_HHMM} le ${CURR_TIME_HHMM}” fi echo “Compared $(echo ${NEEDED_TIME_HHMM} | sed 's/^0*//') \ and $(echo ${CURR_TIME_HHMM} | sed 's/^0*//')” |
3. Starting a script in the background with output going to a log file
A script can be started in the background as follows:
./run_mycode.sh $1 > /var/tmp/logs/run_mycode.log 2>&1 &
where
- "$1" is a parameter (can be more: $2, $3, etc.)
- "> /var/tmp/logs/run_mycode.log" redirects output into the log file
- "2>&1" redirects STDERR to STDOUT, so that error messages will be visible in the same log with other messages. This is especially important when you start SYBASE isql in your script, as print command sends output to STDERR while select sends output to STDOUT. Further explanations regarding redirection in UNIX can be found here.
- final "&" means "run in the background"
4. To clean all the files with name like *.log older than 7 days, run:
VCS_LOG_DIR=/mydirectory find ${VCS_LOG_DIR} -name "*.log" -mtime +7 -exec rm -f {} \;if you want to delete all the files up-to 7 days old, replace +7 for -7
5. Working with a list of values in a shell script
Here is a simple example that illustrates how to use a list of values saved in a file.
First create a file config_list.txt and populate it with values as follows
myproc_a
myproc_b
myproc_c
myproc_d
Now create the script below and execute it
#!/bin/sh SCRIPT_DIR=. CONFIG_DIR=. SERVERS=`cat ${CONFIG_DIR}/config_list.txt` for SERVER in $SERVERS do count=`expr $count + 1` echo "Monitoring Server ${count} Named ${SERVER}..." done |
The output will look like
Monitoring Server 1 Named myproc_a...
Monitoring Server 2 Named myproc_b...
Monitoring Server 3 Named myproc_c...
Monitoring Server 4 Named myproc_d...
NOTE: Variable $count in your script counts the items in your list.
6. Forcing symbolic link
If you need to force an existing symbolic link to a different directory you can do it as followsln -s myOldDir myLink
$ ls -lrt drwxr-xr-x 9 user1 users 4096 May 9 18:24 myOldDir drwxr-xr-x 9 user1 users 4096 May 9 18:24 myNewDir lrwxr-xr-x 9 user1 users 22 May 9 18:24 myLink -> myOldDir
Now force the relinking
ln -sfn myNewDir myLink
$ ls -lrt drwxr-xr-x 9 user1 users 4096 May 9 18:24 myOldDir drwxr-xr-x 9 user1 users 4096 May 9 18:24 myNewDir lrwxr-xr-x 9 user1 users 22 May 9 18:24 myLink -> myNewDir
7. Using awk to calculate a sum of values in a file
Let's say we have a file with the data like below
testdata 1 testdata000000000000001.11 sfd testdata 1 testdata000000000000002.22 sfd testdata 1 testdata000000000000003.33 sfd testdata 1 testdata000000000000001.01-sfd testdata 1 testdata000000000000001.01-sfdA numeric value is written in positions 20-37, a sign is in position 38, space means positive number
The command below will calculate the sum of the numbers. I had to split it into 2 lines to fit into this area, hence the \ in the end of the first line
awk '{ s=substr($0,38,1); $n=substr($0,20,18)+0; var=sprintf("%.2f", s $n); \
sum=sum+var;} END { printf("%.2f", sum);}' testdata.txt
Returns 4.64
8. Dynamic Variables (Variable Variable) in bash and ksh
Below are two scripts that demonstrate usage of dynamic variables in bash and ksh.
#!/bin/bash VAR_AAA=text_for_aaa VAR_BBB=text_for_bbb TYPE=AAA VAR_DYNO=VAR_${TYPE} echo ${VAR_DYNO}=${!VAR_DYNO} |
#!/bin/ksh VAR_AAA=text_for_aaa VAR_BBB=text_for_bbb TYPE=AAA typeset -n VAR_DYNO="VAR_${TYPE}" echo VAR_${TYPE}=${VAR_DYNO} |
Both scripts return VAR_AAA=text_for_aaa
9. Using an array to verify connectivity to multiple hosts
If you need to check if you have connectivity to a list of hosts you can use the following script
#!/bin/sh funtln () { telnet ${SRV} << EOO quit EOO } SERVERS=( '192.168.1.105:443' '192.168.1.105:80' '192.168.1.105:443') echo ${SERVERS[*]} for SERVER in ${SERVERS[@]} do count=`expr $count + 1` echo "Testing Server ${count} Named ${SERVER}..." SRV=`echo ${SERVER} | sed 's/:/ /'` funtln done |
10. Using Dynamic Array Variables in bash
If you need to check a log file for patterns used by some applications. Each of the applications can leave different patterns in a log file. You can use dynamic array variables in bash for this. Here is how.
Create a config file /tmp/test.conf with the following contents
APPS=("APP1" "APP2" "APP3") APP1=("A1_123" "A1_456") APP2=("A2_987") APP3=("A3_123" "A3_456") |
APPS is a list of applications, APP1, APP2, APP3 are the lists of patterns that we want to check for each application.
The code will look like following
#!/bin/bash . /tmp/test.conf for APP in ${APPS[@]} do VAR_APP=${APP} echo "----Checking for ${VAR_APP}" eval TAGS=( '"${'${APP}'[@]}"' ) for TAG in "${TAGS[@]}" do echo "TAG=${TAG} " #Put grep ${TAG} mylogfile | wc -l here to get the counts done done |
We source the config file, then go through the APPS array to get the names of the arrays that contain the patterns.
If you run this program you will get the following output
----Checking for APP1 TAG=A1_123 TAG=A1_456 ----Checking for APP2 TAG=A2_987 ----Checking for APP3 TAG=A3_123 TAG=A3_456
No comments:
Post a Comment