shell条件判断if中的-a到-z的意思

shell if判断中常用的也就是绿色部分,尾部部分越看越不懂。从百度文库转载。

[ -a FILE ] 如果 FILE 存在则为真。

[ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真。

[ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真。

[ -d FILE ] 如果 FILE 存在且是一个目录则为真。

[ -e FILE ] 如果 FILE 存在则为真。

[ -f FILE ] 如果 FILE 存在且是一个普通文件则为真。

[ -g FILE ] 如果 FILE 存在且已经设置了SGID则为真。

[ -h FILE ] 如果 FILE 存在且是一个符号连接则为真。

[ -k FILE ] 如果 FILE 存在且已经设置了粘制位则为真。

[ -p FILE ] 如果 FILE 存在且是一个名字管道(F如果O)则为真。

[ -r FILE ] 如果 FILE 存在且是可读的则为真。

[ -s FILE ] 如果 FILE 存在且大小不为o则为真。

[ -t FD ] 如果文件描述符 FD 打开且指向一个终端则为真。

[ -u FILE ] 如果 FILE 存在且设置了SUID (set user ID)则为真。

[ -w FILE ] 如果 FILE 如果 FILE 存在且是可写的则为真。

[ -x FILE ] 如果 FILE 存在且是可执行的则为真。

[ -O FILE ] 如果 FILE 存在且属有效用户ID则为真。

[ -G FILE ] 如果 FILE 存在且属有效用户组则为真。

[ -L FILE ] 如果 FILE 存在且是一个符号连接则为真。

[ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read则为真。

[ -S FILE ] 如果 FILE 存在且是一个套接字则为真。

[ FILE1 -nt FILE2 ] 如果 FILE1 has been changed more recently than FILE2, or 如果 FILE1 exists and FILE2 does not则为真。

[ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在则为真。

[ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的设备和节点号则为真。

[ -o OPTIONNAME ] 如果 shell选项 “OPTIONNAME” 开启则为真。

[ -z STRING ] “STRING” 的长度为零则为真。

[ -n STRING ] or [ STRING ] “STRING” 的长度为非零 non-zero则为真。

[ STRING1 == STRING2 ] 如果2个字符串相同。 “=” may be used instead of “==” for strict POSIX compliance则为真。

[ STRING1 != STRING2 ] 如果字符串不相等则为真。

[ STRING1 < STRING2 ] 如果 “STRING1” sorts before “STRING2” lexicographically in the current locale则为真。

[ STRING1 > STRING2 ] 如果 “STRING1” sorts after “STRING2” lexicographically in the current locale则为真。

[ ARG1 OP ARG2 ] “OP” is one of -eq, -ne, -lt, -le, -gt or -ge. These arithmetic binary operators return true if “ARG1” is equal to, not equal to, less than, less than or equal to, greater than, or greater than or equal to “ARG2”, respectively. “ARG1” and “ARG2” are integers.

shell脚本统计apache日志中页面访问量

需求:在程序中有两个页面,用于某种用途,现需要统计这两个页面在每分钟内的访问量,包括总访问次数,成功次数(状态码200),失败次数。然后写入到mysql中。

mysql字段:id(自增长)、time(实际统计时间)、year、month、day、hour、visit(总访问量)、success、fail、target(目标)

脚本下载地址:https://www.rootop.org/rs/shell_scripts/analysis_apache_log.sh

#!/bin/bash
#Create By  : www.rootop.org
#MailAddress: venus@rootop.org
#Version    : analysis_apache_log ver1.0
#Data       : 2014/11/12
#Desc       : analysis apache log for witch pages with one minutes
#install bc packages with yum install -y bc if not found bc command

logdir=/var/log/httpd/80/access
logfile=$logdir/$(date +%Y%m%d)_access_log

month=$(date|awk '{print$2}')
day=$(date|awk '{print$3}')
year=$(date|awk '{print$6}')
hour=$(date|awk '{print$4}'|cut -d: -f1)
min=$(date|awk '{print$4}'|cut -d: -f2)

# get current system times to /tmp
echo $month > /tmp/month.txt
echo $day > /tmp/day.txt
echo $year > /tmp/year.txt
echo $hour > /tmp/hour.txt
echo $min > /tmp/min.txt

# compute run minute
if [ "$min" == "00" ]; then
        RUN_MINUTE=59
        else
                if [ "$(awk -F '' '{print$(NF-1)}' /tmp/min.txt)" == "0" ]; then
			echo $(awk -F '' '{print$NF}' /tmp/min.txt) > /tmp/min2.txt
                        echo $(cat /tmp/min2.txt) -1|bc > /tmp/run_minute.txt

				if [ "cat /tmp/run_minute.txt" == "0" ]; then
                                	RUN_MINUTE=00
				else
					RUN_MINUTE=0$(cat /tmp/run_minute.txt)
                                fi

                else

                         echo $(cat /tmp/min.txt) -1|bc > /tmp/run_minute.txt
				if [ "$(cat /tmp/run_minute.txt)" == "9" ]; then
					RUN_MINUTE=09
				else
	                        	RUN_MINUTE=$(cat /tmp/run_minute.txt)
				fi
                fi

fi

# compute run hour
if [ "$hour" == "00" ]; then
        if [ "$min" == "00" ]; then
        RUN_HOUR=23
	else
		RUN_HOUR=$hour
        fi
	else
		if [ "$min" == "00" ]; then
			if [ "$(awk -F '' '{print$(NF-1)}' /tmp/hour.txt)" == "0" ]; then
			echo $(awk -F '' '{print$NF}' /tmp/hour.txt) > /tmp/hour2.txt
			echo $(cat /tmp/hour2.txt) -1|bc >/tmp/run_hour.txt
				if [ "$(cat /tmp/run_hour.txt)" == "0" ]; then
					RUN_HOUR=00
	                          else
                                	RUN_HOUR=0$(cat /tmp/run_hour.txt)
				fi
			else
				echo $(cat /tmp/hour.txt) -1|bc >/tmp/run_hour.txt
				RUN_HOUR=$(cat /tmp/run_hour.txt)
			fi
		else
			RUN_HOUR=$hour
		fi
fi

# get run log file
if [ "$hour" == "00" ]; then
	if [ "$min" == "00" ]; then
	RUN_LOG=$logdir/$(date -d last-day +%Y%m%d_access_log)
		else
		RUN_LOG=$logfile
	fi
	else
		RUN_LOG=$logfile
fi

# begin log analysis
p1=cnbpush.php
p2=jlpush.php

if [ "$hour" == "00" ]; then
	if [ "$min" == "00" ]; then
		INSERT_TIME=$(date -d '-1 hours' +%Y%m%d |cut -c 3-8)$RUN_HOUR$RUN_MINUTE
		else
		INSERT_TIME=$(date +%Y%m%d |cut -c 3-8)$RUN_HOUR$RUN_MINUTE
	fi
	else
		INSERT_TIME=$(date +%Y%m%d |cut -c 3-8)$RUN_HOUR$RUN_MINUTE

fi

echo $INSERT_TIME | cut -c 1-2 > /tmp/IY
echo $INSERT_TIME | cut -c 3-4 > /tmp/IM
echo $INSERT_TIME | cut -c 5-6 > /tmp/ID
echo $INSERT_TIME | cut -c 7-8 > /tmp/IH
INSERT_YEAR=20$(cat /tmp/IY)
INSERT_MONTH=$(cat /tmp/IM)
INSERT_DAY=$(cat /tmp/ID)
INSERT_HOUR=$(cat /tmp/IH)

CN_TOTAL_ACCESS=$(cat $RUN_LOG | grep "$p1" | awk -F ':' '{print$2$3}'| grep "$RUN_HOUR$RUN_MINUTE" | wc -l)
CN_SUCC_ACCESS=$(cat $RUN_LOG | grep "$p1" | grep "200" | awk -F ':' '{print$2$3}'| grep "$RUN_HOUR$RUN_MINUTE" | wc -l)
CN_FAIL_ACCESS=$(cat $RUN_LOG | grep "$p1" | grep -v "200" | awk -F ':' '{print$2$3}'| grep "$RUN_HOUR$RUN_MINUTE" | wc -l)

JL_TOTAL_ACCESS=$(cat $RUN_LOG | grep "$p2" | awk -F ':' '{print$2$3}'| grep "$RUN_HOUR$RUN_MINUTE" | wc -l)
JL_SUCC_ACCESS=$(cat $RUN_LOG | grep "$p2" | grep "200" | awk -F ':' '{print$2$3}'| grep "$RUN_HOUR$RUN_MINUTE" | wc -l)
JL_FAIL_ACCESS=$(cat $RUN_LOG | grep "$p2" | grep -v "200" | awk -F ':' '{print$2$3}'| grep "$RUN_HOUR$RUN_MINUTE" | wc -l)

DB_NAME=shell_log
DB_USER=root
DB_PASS=root
DB_TAB=log

mysql -u$DB_USER -p$DB_PASS $DB_NAME -e "INSERT INTO $DB_TAB(time,year,month,day,hour,visit,success,fail,target) VALUES ('$INSERT_TIME', '$INSERT_YEAR', '$INSERT_MONTH', '$INSERT_DAY', '$INSERT_HOUR', '$CN_TOTAL_ACCESS', '$CN_SUCC_ACCESS', '$CN_FAIL_ACCESS', 'cnbpush');"
mysql -u$DB_USER -p$DB_PASS $DB_NAME -e "INSERT INTO $DB_TAB(time,year,month,day,hour,visit,success,fail,target) VALUES ('$INSERT_TIME', '$INSERT_YEAR', '$INSERT_MONTH', '$INSERT_DAY', '$INSERT_HOUR', '$JL_TOTAL_ACCESS', '$JL_SUCC_ACCESS', '$JL_FAIL_ACCESS', 'jlpush');"

exit

放到任务计划,一分钟一执行。

netstat与awk命令统计网络连接数的方法

使用netstat与awk命令,统计网络连接数。

代码示例:

netstat -an | awk '/^tcp/ {++state[$NF]} END {for(i in state) print i,"\t",state[i]}'

得到类似下面的结果:
TIME_WAIT 12
FIN_WAIT1 3
ESTABLISHED 16
LISTEN 4
这条命令可以把当前系统的网络连接状态分类汇总。
以下是对命令中各参数的解释,以帮助大家理解:
/^tcp/
滤出tcp开头的记录,屏蔽udp, socket等无关记录
state[]
相当于定义了一个名叫state的数组
NF
表示记录的字段数,如上所示的记录,NF等于6
$NF
表示某个字段的值,如上所示的记录,$NF也就是$6,表示第6个字段的值,也就是TIME_WAIT
state[$NF]
表示数组元素的值,如上所示的记录,就是state[TIME_WAIT]状态的连接数
++state[$NF]
表示把某个数加一,如上所示的记录,就是把state[TIME_WAIT]状态的连接数加一
END
表示在最后阶段要执行的命令
for(i in state)
遍历数组
print i,”\t”,state[i]
打印数组的键和值,中间用\t制表符分割

shell批量解压tar.gz压缩包

在搭建某些环境的时候需要安装N多的tar.gz的源码包,一个个解压实在是累得慌,本想用通配符,结果不支持,后来用for循环解决:

#!/bin/bash
D_DIR='/root/lnmp'

for x in `ls ${D_DIR}`
do
tar zxvf $D_DIR/$x -C $D_DIR
done

把所有的tar.gz包放到/root/lnmp目录下(可自行修改),然后把脚本放到任意位置(/root/lnmp路径除外,因为它会把脚本本身当成压缩包解压,就会报错。)执行即可。

shell脚本关闭selinux

#!/bin/bash
CHECK=$(grep SELINUX= /etc/selinux/config | grep -v "#")
if [ "$CHECK" == "SELINUX=enforcing" ]; then
        sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
        setenforce 0
fi
        if [ "$CHECK" == "SELINUX=permissive" ]; then
                sed -i 's/SELINUX=permissive/SELINUX=disabled/g' /etc/selinux/config
                setenforce 0
        fi

                if [ "$CHECK" == "SELINUX=disabled" ]; then
                        exit
                fi
exit