您的位置:首页 > 运维架构 > Shell

shell 指令(二)

2015-11-30 14:25 573 查看
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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: