基础语法
循环
代码块 |
---|
|
#!/bin/bash
for i in `seq 1 10`
do
echo "xxxx"
done |
SHELL中的特定变量
- $# 传递到脚本的参数个数
- $* 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此项参数可超过9个
- $$ 脚本运行的当前进程ID号
- $! 后台运行的最后一个进程的进程ID号
- $@ 与 $# 相同,但使用时加引号,并在引号中返回参数个数
- $- 显示shell使用的当前选项,与SET命令功能相同
- $? 显示命令最后退出的状态。0表示没有错误,其他任何值表明有错误
SHELL脚本语法检查
以上命令可以检查shell脚本中是否存在语法错误,如果没有异常输出证明脚本没有明显的语法问题。
该命令可以看到每行代码的原始命令以及命令执行时的情况,包括运算结果、逻辑判断结果、变量赋值等。
常用命令
查找文件
代码块 |
---|
|
$ find . -name 'name' #默认支持递归查询
$ #查找某个具体日期之后修改过的文件
$ find . -newermt “2015-05-10”
$ #查找某个具体日期之前修改过的文件
$ find . ! -newermt “2015-05-10" |
查找文件后执行命令
代码块 |
---|
|
$ find . -name 'name' | xargs -n 1 cat |
比较文件夹
代码块 |
---|
|
$ diff -r -x *.bak -c folder1 folder2 |
拷贝文件的时候排除svn文件
copy with tar 技巧:
代码块 |
---|
|
$ tar --exclude='.svn' -c -f - /path/to/sourcedir/* | (cd /path/to/destdir ; tar xfp -)
$ # 比较懒的方法,拷贝后删除
$ find /path/to/destdir -name '.svn' -exec rm -r {} \;
$ # svn的导出export功能
$ # 使用rsync方法:
$ rsync -r --exclude=.svn /home/user/progname/ /home/user/progname.copy |
一条循环统计的命令
代码块 |
---|
|
$ for((i=110714;i<110719;i++)); do echo -e "$i\t\c" ; zgrep 'systemnotice' $i/$i.t.leju.com_*.cn.gz | wc -l; done |
利用循环,分别统计gz文件中含有关键字的记录,同时打印出日期和统计结果
使用到了 echo -e 属性,还用到了 zgrep 来查找经过gzip压缩的文件内容。
扩展用法,利用echo打印三列内容。
代码块 |
---|
|
$ for((i=110804;i<110816;i++)); do echo -e "$i\t\c"; echo -n `zgrep '/love/?m=yiqiso&a=showtop HTTP/1.1' $i/$i.t.leju.com_*.cn.gz | wc -l`;echo -e "\t" `zgrep '/love/?m=yiqiso&a=showtop HTTP/1.1' $i/$i.t.leju.com_*.cn.gz | awk '{print $1}' | awk -F ":" '{print $2}' | uniq -c | wc -l`; done |
利用 echo -n 同行打印的功能,将第三行的内容合并到上面一行中。第二个统计数字为日志中的独立IP数目,利用uniq -c 来进行统计
修改服务器时间
代码块 |
---|
|
date 显示当前时间
date -s "2007-08-03 14:15:00" 修改时间
clock -w 把系统时间写入CMOS
hwclock --set --date="03/19/2013 19:09:00" |
替换文件某行的内容
查找前缀和后缀符合特定要求的内容,并进行替换
代码块 |
---|
|
1,$s/^BHME\(\S\)\(\S\)\(\S*\)\(\S\)\(\S\)\.jpg/\/BHME\/Source_pic\/\1\5\/\2\4\/BHME\1\2\3\4\5\.jpg/g |
查找文件内容中含有特定字符的文件,并列出文件列表
代码块 |
---|
|
find . -type f -exec grep 'anlian' -l {} \; |
查找文件内容并删除保存
代码块 |
---|
|
sed -i '/aaa/d' filename |
查找第五列的内容,并且取部分内容
代码块 |
---|
|
for i in `awk '{print gensub(/\/data1\/static\.house\.sina\.com\.cn\/cricfs\//,"","g",$5) }' /data1/logs/vfslog/received/111122/111122-upload.file.dc.cric.com.log`;do `rsync -Rtp $i 172.16.244.156::upload_file_dc_cric_com_storage/`; done; |
查找并杀死符合条件的进程
代码块 |
---|
|
$ kill -9 `ps -ef | grep php | grep -v grep | awk '{print $2}'`
# 这个命令可以杀死一条符合条件的进程
$ ps -ef | grep background |awk '{print $2}' | sed "s/^/kill -9 /g"|sh -
# 这样就可以杀死多个进程 |
批量生成建表语句
代码块 |
---|
|
for((i=0;i<=100;i++)); do sed s/#/$i/ test >> sql; done; |
批量修改文件名
Linux有一个很好用的rename命令,格式如下:rename oldpattern newpattern files
还可以使用脚本的方式,其中用到了sed的替换指令。
代码块 |
---|
|
for i in *;do OUT=$(echo $i | sed 's/ *//g');mv "$i" $OUT;done; |
完全使用sed的一个方案,看不太明白
代码块 |
---|
|
ls | sed -n '/ /{h;s/ //g;G;s/ /\\ /g;s/\(.*\)\n\(.*\)/mv \2 \1/e}' |
查看系统的发行版本
代码块 |
---|
|
cat /etc/issue
cat /etc/redhat-release |
添加路由
代码块 |
---|
|
route add -net 10.71.32.0/24 gw 172.16.228.1
#删除路由
route del -net 0.0.0.0 gw 192.168.56.1 |
SED查找内容并输出
查询匹配的内容并输出
代码块 |
---|
|
sed -n '/17\/Apr\/2011/,$p' /data0/bbslog/110423/i.house.sina.com.cn_244192.log > output_test |
时间处理
代码块 |
---|
|
# 查看当前时间戳
$ date +%s
# 查看指定时间的时间戳
$ date -d 2008-01-01 +%s
$ date -d 20080101 +%s
# 将时间戳转换为日期字符串
$ date -d '1970-01-01 UTC 1199116800 seconds'
2008年 01月 01日 星期二 00:00:00 CST
$ export LANG=en
$ date -d '1970-01-01 UTC 1199116800 seconds'
Tue Jan 1 00:00:00 CST 2008
# 将时间戳转换为日期格式
$ date -j -f "%s" 160336789645 "+%Y-%m-%d %H:%M:%S" //Mac下有效
$ date -d @1557025194 "+%Y-%m-%d" //Mac下无效 |
AWK抽取文件内容
代码块 |
---|
|
# 抽取文件的奇数行
$ awk 'NR%2' file
# 抽取文件的偶数行
$ awk 'NR%2==0' file |
文件的压缩与解压缩
代码块 |
---|
|
tar -czf xxx.tar.gz folders
# 压缩并打包目录 |
文件系统挂载
代码块 |
---|
|
$ mount 11.155.x.x:/vol/xxx /folder |
crontab
1、说明
* * * * * cmd
分 时 日 月 周 命令
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
2、示例
代码块 |
---|
|
#每晚的21:30 重启apache
30 21 * * * /usr/local/etc/rc.d/lighttpd restart
#每月1、10、22日的4 : 45重启apache
45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
#每周六、周日的1 : 10重启apache
10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
#每天18 : 00至23 : 00之间每隔30分钟重启apache
0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
#晚上11点到早上7点之间,每隔一小时重启apache
* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
#每一小时重启apache
* */1 * * * /usr/local/etc/rc.d/lighttpd restart
#每月的4号与每周一到周三的11点重启apache
0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
#一月一号的4点重启apache
0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
#每半小时同步一下时间
*/30 * * * * /usr/sbin/ntpdate 210.72.145.44 |
chmod
设置普通用户具有执行ipset的权限
namei
显示详细的用户权限
curl
发送GET请求
代码块 |
---|
|
curl http://status.myj.com.cn |
发送POST请求
代码块 |
---|
|
curl -d 'select * from passwod' http://status.myj.com.cn |
代码块 |
---|
|
curl -H "Content-Type:application/json" -X POST -d '{"post_data":"select * from password"}' 'https://status.myj.com.cn' |
批量查找替换
代码块 |
---|
|
sed -i '/ssl on\;/d' `grep -rl "ssl on" ./*.conf` #删除所有.conf文件中的 ssl on;行
sed -i 's/listen 443\;/listen 443 ssl\;/' `grep -rl "listen 443" ./*.conf` #将所有.conf 文件的 listen 443;行替换为 listen 443 ssl; |
内核更新
http://elrepo.org/tiki/tiki-index.php
Shell相关
Shell特殊变量
变量 | 说明 |
---|
$0 | 当前脚本名 |
$[n] | 通过命令传递进入的参数,例如$1、$2 |
$# | 通过命令传递进入的参数数量 |
$* | 通过命令传递进入的所有参数 |
$$ | 当前shell的进程ID |
$? | 上个命令的退出状态或返回值 |
命令替换
代码块 |
---|
#!/bin/bash
now=`date`
echo "date now is ${now}" |
关系运算
关系运算符只支持数字,返回为真或假
运算符 | 说明 |
---|
-eq | 2边相等 |
-ne | 不等于 |
-gt | 左边是否大于右边 |
-lt | 左边是否小于右边 |
-ge | 左边是否大于等于右边 |
-le | 左边是否小于等于右边 |
字符串运算符
文件测试运算符
运算符 | 说明 |
---|
-b file | 文件是否为块设备 |
-c file | 文件是否为字符设备 |
-d file | 文件是否为目录 |
-f file | 文件是否为普通文件 |
-p file | 文件是否为管道文件 |
-r file | 文件是否可读 |
-w file | 文件是否可写 |
-x file | 文件是否可执行 |
-s file | 文件是否为空 |
-e file | 文件是否存在 |
查找所有.sh文件并批量授权
find /var -name "*.sh" -exec chmod 755 {} \;
find ./ -not -name “*.bash” -exec chmod o+x {} \;
查看 CPU 占用高的前10个进程
代码块 |
---|
ps aux|grep -v PID|sort -nr -k3|head -n10
ps aux|head -n1;ps aux|grep -v PID|sort -nr -k3|head -n10
ps aux|head -n1;ps aux|grep -v PID|sort -nr -k4|head -n10 |
sort #排序命令
-nr #默认使用字符串排序n代表使用数值进行排序 默认从小到大排序 r代表反向排序
-k3 #以第3列进行排序
grep -v PID #输出的第一行也参与的排序,去除掉
PID:进程的ID
USER:进程所有者
PR:进程的优先级别,越小越优先被执行
NInice:值
VIRT:进程占用的虚拟内存
RES:进程占用的物理内存
SHR:进程使用的共享内存
S:进程的状态。S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值为负数
%CPU:进程占用CPU的使用率
%MEM:进程使用的物理内存和总内存的百分比
TIME+:该进程启动后占用的总的CPU时间,即占用CPU使用时间的累加值。
COMMAND:进程启动命令名称
vim 常用查找替换操作
1、删除空行
:g/^$/d
2、删除空行以及只有空格的行
:g/^\s*$/d
3、删除以 # 开头或 空格# 或 tab#开头的行
:g/^\s*#/d
4、对于 php.ini 配置文件,注释为 ; 开头
:g/^\s*;/d
5、使用正则表达式删除行,如果当前行包含 bbs ,则删除当前行
:/bbs/d
6、删除从第二行到包含 bbs 的区间行
:2,/bbs/d
7、删除从包含 bbs 的行到最后一行区间的行
:/bbs/,$d
8、删除所有包含 bbs 的行
:g/bbs/d
9、删除匹配 bbs 且前面只有一个字符的行
:g/.bbs/d
10、删除匹配 bbs 且以它开头的行
:g/^bbs/d
11、删除匹配 bbs 且以它结尾的行
:g/bbs$/d
12、.ini 的注释是以 ; 开始的,如果注释不在行开头,那么删除 ; 及以后的字符
:%s/\;.\+//g
13、删除 # 之后所有字符
%s/\#.*//g
14、删除指定字符串(从 n 行开始删除 test 字符串)
:n,$s/test//