正在浏览 Shell脚本 里的文章

一:"'$var'"

这种写法大家无需改变用'括起awk程序的习惯,是老外常用的写法.如:

var="test"
awk 'BEGIN{print "'$var'"}'

这种写法其实际是双括号变为单括号的常量,传递给了awk.

如果var中含空格,为了shell不把空格作为分格符,便应该如下使用:
var="this is a test"
awk 'BEGIN{print "'"$var"'"}'

二:'"$var"'

这种写法与上一种类似.如果变量含空格,则变为'""$var""'较为可靠.

三.把括起awk程序的''变为"",使用"$var"

如:
$var="this is a test"
awk 'BEGIN{print "$var"}"
这是因为在""里$是特殊字符,而在''里$是普通字符.

四:export 变量,使用ENVIRON["var"]形式,

如:
$var="this is a test";export $var
awk 'BEGIN{print ENVIRON["var"]}'

五:当然也可以使用-v选项

如:
$var="this is a test"
awk -vnvar="$var" '{print nvar}'

这样便把系统变量定义成了awk变量.

1、$$变量保存所运行的当前进程的进程号。$0 代表脚本文件名。$# 代表参数的个数、$_变量中存放上一条命令中最后一个参数的值


2、trap 命令可以捕获控制台信号
答:利用trap可以做Ctrl+C结束脚本时需要做的清理操作如:trap "ClearPID" 1 2 3 15


3、tee将信息输出到多个文件
答:echo "ok" | tee -a a.txt >>b.txt


4、查看本机tcp连接状态及数目统计
答:netstat -n |awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' | sort -n -k 2 -r


5、IFS变量
答:
IFS用作shell指定的缺省域分隔符。原理上讲域分隔符可以是任意字符,但缺省通常为空格、新行或tab键。IFS在分隔文件或变量中各域时很有用。下面的例子将IFS设置为冒号,然后echo $PATH变量,给出一个目录分隔开来的可读性很强的路径列表。


6、while循环中最简单写死循环的方法为
答:

while :
do
do someting
done

7、 查出目前 ip_conntrack 记录最多的前五名 IP
答:cat /proc/net/ip_conntrack | cut -d ' ' -f 10 | cut -d '=' -f 2 | sort | uniq -c | sort -nr | head -n 5


8、linux bash中暂时屏蔽 alias
答:\ 对,正是这个斜线可以暂时屏蔽alias的定义,如:cp -r 就不会再有是否覆盖的提示了。


9、在文件中查找指定内容并且显示该内容,并不是显示内容所在的行
答:利用sed -o参数就可以解决问题了


10、创建/删除多个连续的文件(大括号的应用)
答:利用大括号({})来搞定,如:

$ touch Front-{A,B,C}-Back
$ ls -1
Front-A-Back
Front-B-Back
Front-C-Back
$ echo Number_{1..5}
Number_1 Number_2 Number_3 Number_4 Number_5
$ echo {Z..A}
Z Y X W V U T S R Q P O N M L K J I H G F E D C B A
$ echo a{A{1,2},B{3,4}}b
aA1b aA2b aB3b aB4b
$ mkdir {2007..2009}-0{1..9} {2007..2009}-{10..12}
$ ls
2007-01  2007-07  2008-01  2008-07  2009-01  2009-07
2007-02  2007-08  2008-02  2008-08  2009-02  2009-08
2007-03  2007-09  2008-03  2008-09  2009-03  2009-09
2007-04  2007-10  2008-04  2008-10  2009-04  2009-10
2007-05  2007-11  2008-05  2008-11  2009-05  2009-11
2007-06  2007-12  2008-06  2008-12  2009-06  2009-12

11、shell中使用(())进行数字运算
如:

#!/bin/bash
echo -n "how old are you?"
read age
echo "Wow,in $((60-age)) years ,you'll be 60!"

12、shell中读取指定的配置文件并对变量进行赋值
# shell脚本中读取配置文件并做赋值操作

while read NAME TYPE
do
if [ "$NAME" == "" ] || [ "`echo $NAME$TYPE| grep '#'`" != "" ] ;then
continue
else
eval `echo "${NAME}=${TYPE}"`
fi
done

# config.shc 配置文件内容
====== config.shc ========
# 注释内容
变量名 值
===========================
注意:配置文件中的变量名和值之间用Tab分格!


本文最后更新于2010.05.27


原创文章,转载请注明: 转自 http://salogs.com

Shell字符串截取
一、Linux shell 截取字符变量的前8位,有方法如下:

1.expr substr “$a” 1 8
2.echo $a|awk ‘{print substr(,1,8)}’
3.echo $a|cut -c1-8
4.echo $
5.expr $a : ‘\(.\\).*’
6.echo $a|dd bs=1 count=8 2>/dev/null

二、按指定的字符串截取

1、第一种方法:

    * ${varible##*string} 从左向右截取最后一个string后的字符串
    * ${varible#*string}从左向右截取第一个string后的字符串
    * ${varible%%string*}从右向左截取最后一个string后的字符串
    * ${varible%string*}从右向左截取第一个string后的字符串

“*”只是一个通配符可以不要

例子:
$ MYVAR=foodforthought.jpg
$ echo ${MYVAR##*fo}
rthought.jpg
$ echo ${MYVAR#*fo}
odforthought.jpg

2、第二种方法:${varible:n1:n2}:截取变量varible从n1到n2之间的字符串。

可以根据特定字符偏移和长度,使用另一种形式的变量扩展,来选择特定子字符串。试着在 bash 中输入以下行:
$ EXCLAIM=cowabunga
$ echo ${EXCLAIM:0:3}
cow
$ echo ${EXCLAIM:3:7}
abunga

这种形式的字符串截断非常简便,只需用冒号分开来指定起始字符和子字符串长度。

三、按照指定要求分割:
比如获取后缀名
ls -al | cut -d “.” -f2

Dump MySQL DB Shell

抢板凳

脚本简介:
将MySQL数据库dump出后压缩为gz格式。本脚本支持两个参数。第一个参数为数据库类型(myisam,innodb)第二个参数是想要dump的数据库。如果省略第二个参数默认备份所有。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#!/bin/bash
#================================================
# Name   : dumpdb.sh
# Version: 1.0
# Writer : Nathan.Zhou
# Date   : 2009.06.23
# Modify :
# Info   : 将MySQL数据库dump出后压缩为gz格式。本脚本支持两个参数。第一
#          个参数为数据库类型(myisam,innodb) 第二个参数是想要dump的
#          数据库。如果省略第二个参数默认备份所有。
# History:
#
#================================================
 
. /etc/profile
 
USER="root"
PWD="jobkoo"
CHARACTER="utf8"
 
DATE=`date +%F`
 
DUMP_MYISAM_ARG=" -u $USER -p$PWD --default-character-set=$CHARACTER
--opt --extended-insert=false --triggers -R --hex-blob -x "
 
DUMP_INNODB_ARG=" -u $USER -p$PWD --default-character-set=$CHARACTER --opt
--extended-insert=false --triggers -R --hex-blob --single-transaction "
MYSQL=`which mysql`
MYSQLDUMP=`which mysqldump`
SCP=`which scp`
 
# 本地备份后scp到目标主机的路径
TARGET_PATH="/data/db_dump_sql/"
TARGET_HOST="210.51.191.183|192.168.108.112"
TARGET_TYPE=2 # 选择 TARGET_HOST变量中的第二个主机地址 
 
BAK_FILENAME=rms_db_`date +%F`.sql.gz
 
# argument 1 : mysql data type
DATABASE_TYPE=`echo $1 | tr 'A-Z' 'a-z'`
 
# argument 2 :  to be dumped database
if [ "$2" == "" ];then
    TO_BAK_DB="all"
else
    TO_BAK_DB=`echo $2 | tr 'A-Z' 'a-z'| sed 's/,/ /g'`
fi
 
# 将备份下来的数据库scp到其他主机
function SCPTOHOST()
{
HOST=`echo $TARGET_HOST|cut -d '|' -f $TARGET_TYPE`
$SCP $1 $HOST:$TARGET_PATH
}
 
# 检查用户输入的数据库名是否存在,若存在,执行备份数据库操作
function DUMPSELECTDB()
{
for BASE in $TO_BAK_DB
do
  DB=`$MYSQL -u $USER -p$PWD -e 'show databases;' | grep $BASE`
  if [ "$DB" == "" ];then
    echo "You choose database $DB not exist! please try again!"
    continue
  else
  $MYSQLDUMP $1 -B $BASE | gzip >$TARGET_PATH/$BASE\_$DATE.sql.gz
  SCPTOHOST $TARGET_PATH/$BASE\_$DATE.sql.gz 2>&1>/dev/null
  fi
done
}
 
function DUMPALL()
{
$MYSQLDUMP $1 -A | gzip >$TARGET_PATH/$BAK_FILENAME
SCPTOHOST $TARGET_PATH/$BAK_FILENAME 2>&1>/dev/null
}
 
# main
if [ "$1" == "myisam" ];then
 
   if [ "$TO_BAK_DB" == "all" ];then
	DUMPALL "$DUMP_MYISAM_ARG"
   else
        DUMPSELECTDB "$DUMP_MYISAM_ARG"
   fi
 
elif [ "$1" == "innodb" ];then
 
   if [ "$TO_BAK_DB" == "all" ];then
	DUMPALL "$DUMP_INNODB_ARG"
   else
	DUMPSELECTDB "$DUMP_INNODB_ARG"
   fi
 
else
	echo "please input correct mysql db type!(myisam or innodb)"
	exit 1
fi