shell 指令(二)

来源:互联网 发布:淘宝优惠券群怎么挣钱 编辑:程序博客网 时间:2024/06/05 15:02
1.小结:用户通过系统处理数据,检测硬件数据
用户(user* group* ch*)
系统(top):进程管理ps 优先级nice 定时作业cron
硬件:磁盘 (du/df) 内存(free) cpu(uptime) 网络(net)
数据(mysql):文本(vim/grep ) 文件(find curd/zip output)






2.参数:
-a 追加 全部
-c -f 执行
-d 目录 + delete
-h 字节单位
-i 忽略大小写 交互-p
-l 显示列表
-n 输出行号
-r 反向排序 递归
-s replace
-t 分隔符
-u 去重排序
-v 反选


user( ugoa rwx )
file(-m modify -c change -a access + date: Ymd His)
zip(zj jc(create)v jx(extract)v )
cron((分钟(0-59) 小时(0-23) 日期(1-31) 月份(1-12) 周(0(周日)-6) 命令|(所有时刻) ,(分隔时段) -(时段内) /n(每隔n分钟)))
crontab文件的一些例子:4
- / ,同时使
, /等价
星期 日期并列
可执行文件




#每天早上7点执行一次 /bin/ls : 执行文件
0 7 * * * /bin/ls


#每天18 : 00至23 : 00之间每隔30分钟重启apache。 0,30 相同 /30
0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart


#每天晚上11点到早上7点之间,每隔一小时重启apache - /同时使
* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart


#在 12 月内, 每天的早上 6 点到 12 点中,每隔3个小时执行一次 /usr/bin/backup :
0 6-12/3 * 12 * /usr/bin/backup


#晚上11点到早上8点之间每两个小时,早上8点 - / ,同时使
0 23-7/2,8 * * * date


#每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点 星期和日期是并列的:
0 11 4 * mon-wed date


#每月的4号与每周一到周三的11点重启apache
0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart




其他:


30 21 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每晚的21:30重启apache。


45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每月1、10、22日的4 : 45重启apache。


10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每周六、周日的1 : 10重启apache。


0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每星期六的11 : 00 pm重启apache。


* */1 * * * /usr/local/etc/rc.d/lighttpd restart
每一小时重启apache
/*
0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
一月一号的4点重启apache


周一到周五每天下午 5:00 寄一封信给 alex@domain.name :
0 17 * * 1-5 mail -s "hi" alex@domain.name < /tmp/maildata


每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分....执行 echo "haha"
20 0-23/2 * * * echo "haha"




注意 :当程序在你所指定的时间执行后,系统会寄一封信给你,显示该程序执行的内容,若是你不希望收到这样的信,请在每一行空一格之后加上 > /dev/null 2>&1 即可


#每天早上6点10分
10 6 * * * date


#每两个小时
0 */2 * * * date


#1月份日早上4点
0 4 1 jan * date
/*


3.管道:过滤执行,输出


输出:5
2>/dev/null错误的丢弃
2>&1 正确错误一起输出
< 提取
>> 追加
> 重新写入




字符:12
//tr split tee wc wget iconv tar cut join awk xargs sed
tr 删除冒号 cat /etc/passwd |tr -d ':' > /root/passwd.linux
split 分割10行 split -l 10 ./err.txt termcap
tee 输出文件 cat test.sh | tee -a ok.txt
wc 统计行数 last | grep [a-zA-Z] | grep -v ‘zhouyue' | wc -l
wget下载一个文件: wget -P dir url
iconv 转码:iconv -f from -t to new-aa.txt
tar压缩和解压:tar -cvf -packname filename| tar -xvf -(这个减号是取前面的输出作为输入)
cut 截取第一列 cat /etc/passwd |cut -d ':' -f1 | sort | uniq -c
join 连接字符串 join -t ':' -1 4 /etc/passwd -2 3 /etc/group //-1是第一个文件 -2是第二个文件 4是第四个字段 3是第三个字段 匹配的拿前面去,拼接字符,
awk 选取某一列 cat /etc/passwd | awk -F ':' '{print $5}'>>awk.txt 2>&1
xargs php改名字 ls |grep .php |xargs -i mv {} {}.bak
(sed -n '1,$p' )</etc/passwd #第一行至最后一行, 输出来


4.shell : for while + if case




循环:while
unset var
while [ "$var" != "end" ] # 1.比较时候中括号和等号两头都不能挨着 2.for while if 3.if 判断不挨着 4.read 输入赋值
do # echo -n 不换行
echo -n "please input a number: "
read var
if [ "$var" = "end" ]
then
break
fi
echo "var is $var"
done




循环:for
sum=0
for a in `seq 1 100`
do
if [ `expr $a % 3` -ne 0 ] #expr 加减乘除运算符要有空格
then
continue
fi
echo $a
sum=`expr $sum + $a` #左面赋值的不加$,变量才加$,比如$var
done
echo "sum=$sum"


判断:if then elif then else fi
echo "please input a file name:"
read file_name
if [ -d $file_name ]
then
echo "$file_name is a directory"
elif [ -f $file_name ]
then
echo "$file_name is a regular file"
# elif [ -c $file_name -o -b $file_name ]
# then
# echo "$file_name is a device file"
else
echo "$file_name is an unkonwn file"
fi


判断:case in esac
echo "please input a number"
read number
case $number in
[a-z])
echo 'that is a alpha'
;;
[0-9])
echo 'that is a number'
;;
*)
echo 'please input a alpha or a number'
esac


select 选择
#!/bin/bash
# favourite OS. samli 2004.4.19
echo "What is your favourite OS?"
select var in "Linux" "UNIX" "Windows" "Other"; do
echo "You have selected $var."
#break
done






###定义函数


example1()
{
abc=456
}


###调用函数
example1
echo abc
abc=234234
example1
echo $abc
###定义函数,使用参数
example2()
{
echo $1
echo $2
}


###调用函数,向它传递参数
example2 abc bbb
example2 dksdfsdfsfaa bbb



数组使用

Shell中的数组

一、数组和字符串
Array[3] = "a b c" echo $Array[1]  输出b,
str=“a b c” Array = ($str) echo$Array[1],同样输出b,要注意: Array = ($str)中的右值的括号不能缺
上面这个就是我们常说的把字符串放到一个数组中,也可以理解为动态数组,比C和C++简单多了

计算字符串长度可用的三种方法:
echo “$str”|awk '{print length($0)}'
expr length “$str”
echo “$str”|wc -c
但是第三种得出的值会多1,可能是把结束符也计算在内了

判断字符串为空的方法有三种:
if [ "$str" =  "" ] 
if [ x"$str" = x ]
if [ -z "$str" ] 
二、其他类型的数组
arr=(123 34 3 5) echo $arr,输出123,在这里等同于echo ${arr[0]};
echo ${arr[1]},输出34,注意格式,除了首地址,必须要加上{},否则会出错
三、数组的长度和遍历
length=${#array[@]}----数组的长度,这里的长度是最大下标
echo ${array[@]}-------输出数组全部元素
array[1]=5--------------向数组的某个元素赋值和标c的语法一样
echo ${array[@]:1:2}---输出的是array[0]和array[1]的值
echo ${array[@]:2}-----输出数组第三个元素以后的值
echo ${array[@]::2}-----输出数组下标小于2的值
$ echo ${#array[3]} ----取得元素3的长度
unset array--------------清除array
array=------------------清空array,赋给array空值

遍历字符串方法一
for ((i=0;i<${#array[@]};i++))
do
   echo ${array[$i]}
done

遍历字符串方法二
str="a --m"
for i in $str
do
echo $i
done

用while遍历
len=${#arr[@]}
i=0
while [ $i -lt $len ]
do
echo ${arr[$i]}
let i++
done

四、其他:
Array[3] = "a b c"和Array[3] = a b c这两个是等价的;如果Array[3] = "a "bc"",想要查找",用awk是找不到的,单引号
是可以找到的,就是双引号找不到;我们可以用截取字符串的方法来判断是否双引号,截取的字符串的方法如下:
${varible##*string} 从左向右截取最后一个string后的字符串
${varible#*string}从左向右截取第一个string后的字符串
${varible%%string*}从右向左截取最后一个string后的字符串
${varible%string*}从右向左截取第一个string后的字符串
将上面的string换成“即可,然后在判断字符串的长度,如果相等就是没有,如果不相等就是有双引号,不可以
用更改数组分隔符的方法,那样做无效,这个双引号是shell内建的符号。

通用的awk查找方法,例如:
find=`echo {${arr[$i]}|awk 'BEGIN{FS=""}{for(i=1;i<=NF;i++) if($i==";") print $i}'`;
也可以用math和index方法,例如:flag=`echo {$line}|awk '{print match($0,"channel")}'` 
数组默认的分隔符是空格,如果想改变默认的分隔符,用下面的方法
str="abd#ddd#ff";str2=($(echo $str|tr ''#''|tr -s ''));




+5.mysql:4
全量:所有库-A 指定库-B 库test 表test b 表结构 -d


1、导出数据库为test下面表名为b的数据
mysqldump -uroot -h 127.0.0.1 test b > b_test.sql


2、导出数据库为test的所有数据
mysqldump -uroot -h 127.0.0.1 test >test.sql


3、导出数据库名为test和retail的数据库
mysqldump -uroot -h 127.0.0.1 -B test retail > /data/db.sql


4、导出所有的数据库
mysqldump -uroot -h127.0.0.1 -A > /data/all.sql


5、导出数据库的结构(以上脚本添加选项 -d)
mysqldump -uroot -h 127.0.0.1 test b -d> b_test.sql




增量:3
//binlog转成sql
mysqlbinlog -d database mysql-bin.000014>bin.sql
//备份
mysqldump -uroot -proot —master-data=1(changemasterto) —events -single-transaction (隔离级别为:REPEATABLE READ,不会看到其他会话已经提交了的数据) database gzip>/opt/all.sql.gz




附加:
1.隔离级别-->mvcc原理-->不同隔离级别使用


//隔离(脏读(读取了未提交的数据) 不可重复读/已提交读(本事务读取到了其他事务提交的数据) 可重复读(本事务不会读取其他事务提交后的数据,本事务更新后会才会读取到,但是会产生幻读,mysql mvcc多版本并发解决了这个问题,)


我们知道,mysql的innodb采用的是行锁,而且采用了多版本并发控制来提高读操作的性能。
什么是多版本并发控制呢 ?其实就是在每一行记录的后面增加两个隐藏列,记录创建版本号和删除版本号,而每一个事务在启动的时候,都有一个唯一的递增的版本号。


在查询时要符合以下两个条件的记录才能被事务查询出来:
删除版本号是在当前事务启动之后做的。 创建版本号是在事务启动之前。
这样就保证了各个事务互不影响。从这里也可以体会到一种提高系统性能的思路,就是:
通过版本号来减少锁的争用。


另外,只有read-committed和 repeatable-read 两种事务隔离级别才能使用mVcc
read-uncommited由于是读到未提交的,所以不存在版本的问题
而serializable 则会对所有读取的行加锁。






2.显示binlog 4--寻找binlog 2-->导出binlog 2


1.登录mysql,使用下面的命令可以列出里面binlog 的sql语句的位置:
mysql --user=root -pmy_pwd -e 'SHOW BINLOG EVENTS G'
mysql> show binlog events;


只查看第一个binlog文件的内容
show binlog events;


查看指定binlog文件的内容
show binlog events in 'mysql-bin.000002';


查看当前正在写入的binlog文件
show master status\G


获取binlog文件列表
show binary logs;


*************************** 1. row ***************************
Log_name: mysql-bin.000001
Pos: 4
Event_type: Format_desc
Server_id: 1
End_log_pos: 106
Info: Server ver: 5.1.73-log, Binlog ver: 4
1 row in set (0.00 sec)




根据pos 范围来提取相关的sql 语句,并保存到文件当中:
mysqlbinlog --start-position=98 --stop-position=117 /var/lib/mysql2/mysql-bin.000001 --result-file=/home/binlog.1


查询的同时导入数据库:
mysqlbinlog --start-position=98 --stop-position=117 /var/lib/mysql2/mysql-bin.000001 |mysql -uroot -p


根据时间来进行恢复:
mysqlbinlog --start-datetime="2009-12-01 12:00:00" --stop-datetime="2009-12-01 19:00:00" /var/lib/mysql2/mysql-bin.000001 --result-file=/home/binlog.1


结合系统命令可以只对某个表的操作进行恢复。比如我只恢复对cdr 表的插入动作进行恢复:
#>grep "insert into cdr " /home/binlog.1 >/home/binlog.2
#>mysql -uroot -ppassword asterisk </home/binlog.2




导入大数据:
mysql load data infile 的用法(40w数据 用了3-5秒导进mysql)
* load data infile "d:/Websites/Sxxxx/test1.txt" ignore into table `names` fields terminated by ',' enclosed by '"';


======================备库参考==============================
自动备份数据库脚本两个!
MySQL:Linux下自动备份数据库的shell脚本 Linux 服务器上的程序每天都在更新 MySQL 数据库,于是就想起写一个 shell 脚本,结合 crontab,定时备份数据库。其实非常简单,主要就是使用 MySQL 自带的 mysqldump 命令。


脚本内容如下:
#!/bin/sh
# File: /home/mysql/backup.sh
# Database info
DB_NAME="test"
DB_USER="username"
DB_PASS="password"
# Others vars
BIN_DIR="/usr/local/mysql/bin"
BCK_DIR="/home/mysql/backup"
DATE=`date %F`
# TODO
$BIN_DIR/mysqldump --opt -u$DB_USER -p$DB_PASS $DB_NAME | gzip > $BCK_DIR/db_$DATE.gz


然后使用将此脚本加到 /etc/crontab 定时任务中:
01 5 * * 0 mysql /home/mysql/backup.sh


好了,每周日凌晨 5:01 系统就会自动运行 backup.sh 文件备份 MySQL 数据库了。
/home/www/inc/back
第二个!!!!
#!/bin/sh
# File: /home/mysql/backup.sh
# Database info bakupmysql
DB_USER="user"
DB_PASS="password"
# Others vars
DATE=`date %Y-%m-%d`
mkdir /home/mysqlbak/$DATE
BIN_DIR="/usr/local/mysql/bin"
BCK_DIR="/home/mysqlbak/$DATE"
# TODO
$BIN_DIR/mysqldump --opt -u$DB_USER -p$DB_PASS discuz > $BCK_DIR/discuz.sql
$BIN_DIR/mysqldump --opt -u$DB_USER -p$DB_PASS zjblog > $BCK_DIR/zjblog.sql
$BIN_DIR/mysqldump --opt -u$DB_USER -p$DB_PASS openads > $BCK_DIR/openads.sql






6.运维监控:10


运维监控:10
free -m fdisk -l df -h du-sh 
vmstat/sar/iostat 1 4   // 每隔1秒,显示一次设备统计信息.总共输出4次
uptime w  uptime 12:39:12 up 2:50, 3 users, load average: 0.00, 0.03, 0.00//当前时间 运行时间 几个用户 1-5-15分钟负载
top --http://jingyan.baidu.com/article/4d58d5412917cb9dd4e9c0ed.html


//处理器进程uptime 统计信息 cpu/进程sar 内存free 交换分区 进程显示区
top - 14:07:44 up  2:41,  2 users,  load average: 0.00, 0.00, 0.00
Tasks: 161 total,   1 running, 160 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.3%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   2979092k total,   955380k used,  2023712k free,   144860k buffers
Swap:  2097148k total,        0k used,  2097148k free,   589796k cached
PID USER PR NI  VIRT RES SHR  S %CPU% %MEM%  TIME+ COMMAND






---------查看Linux服务器CPU详细情况--------------
#查看物理CPU的个数
[root@host /]# cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l
---------查看Linux服务器内存情况--------------




#查看内存使用情况
[root@host ~]# free -m 
>total:内存总数
>used:已使用内存数
>free:空闲内存数
>shared:多进程共享内存数
>buffers:缓冲内存数
>cached:缓存内存数
可用内存 = free buffers cached
已用内存 = used-buffers-cached
swap 交换内存数,此项可判断内存是否够用的标准
---------查看Linux服务器硬盘使用情况--------------




#查看硬盘及分区信息
[root@host ~]# fdisk -l 
#检查文件系统的磁盘空间占用情况
[root@host ~]# df -h 
#查看指定目录的大小
[root@host /]# du -sh /bin/    
#查看硬盘的I/O性能
[root@host /]# iostat 1 5#iostaat是含在套装systat中,在CentOs5.5用命令yum -y install sysstat来安装


---------查看Linux服务器的平均负载--------------
[root@host /]# uptime 12:39:12 up 2:50, 3 users, load average: 0.00, 0.03, 0.00
[root@host /]# w 12:39:59 up 2:50, 3 users, load average: 0.00, 0.03, 0.00USER TTY FROM LOGIN@ IDLE JCPU PCPU WHATroot tty1 - 09:53 32:17 0.36s 0.36s -bashroot pts/0 192.168.1.102 10:23 1:54m 0.03s 0.03s -bashroot pts/1 192.168.1.105 12:16 0.00s 0.09s 0.02s w
[root@host /]# vmstat 1 4   // 每隔1秒,显示一次设备统计信息.总共输出4次.
#proces r:等待运行的进程数 b:非中断睡眠状态的进程数 w:被交换出去的可运行进程数
#memory swpd:虚拟内存使用情况 fres:空闲的内存 buff:用作缓存的内存数(单位:KB)
#swap si:从磁盘交换到内存的交换页数量 so:从内存交换到磁盘的交换页数量(单位:kb/秒)
#io bi:发送到块设备的块数 bo:从块设备接收到的块数(单位:块/秒)
#system in:每秒的中断数,包括时钟中断 cs:每秒的环境(上下文)切换数
#cpu us:CPU使用时间 sy:CPU系统使用时间 id:闲置时间(单位:百分比)
标准情况下:r小于5,b约为0
如果user sys 小于70 表示系统性能较好;如果大于等于85以上,表示性能比较糟糕


sar --系统 sar -u 3 5 | sar -P 3 5
%usr:CPU处在用户模式下的时间百分比。
%sys:CPU处在系统模式下的时间百分比。
%wio:CPU等待输入输出完成时间的百分比。
%idle:CPU空闲时间百分比。
在所有的显示中,我们应主要注意%wio和%idle,
 * %wio的值过高,表示硬盘存在I/O瓶颈,
 * %idle值高,表示CPU较空闲,
 * 如果%idle值高但系统响应慢时,有可能是CPU等待分配内存,此时应加大内存容量。
 * %idle值如果持续低于10,那么系统的CPU处理能力相对较低,表明系统中最需要解决的资源是CPU。
0 0
原创粉丝点击