shell脚本总结

1、命令丢失
在搭建服务时,添加服务命令追加到PATH变量文件/etc/profile中,(注意:所有变量都可写入此文件中永久生效),例如
echo “PATH=/usr/local/mysql/sbin”>> /profile ,如果这样追加,导致内建命令和系统名都无法调用;解决办法:
echo“PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin”>> /etc/profile
/bin/bash /etc/profile
source /etc/profile //这样命令就能正常使用了
2、内建命令和系统命令
在linux中,shell内建命令是指bash(或其它shell)工具集中的命令,在PATH环境变量找不到,例如source;
但很多内建命令一般都会有一个与之同名的系统命令,比如bash中的echo命令与/bin/echo是两个不同的命令;
使用type 命令来查看某个命令是否为内建在bash当中的命令,例如
[root@www ~]# type echo
echo is a shell builtin
[root@www ~]# type nslookup
nslookup is /usr/bin/nslookup
3、关于shell介绍
http://blog.csdn.net/sujz12345/article/details/54565056
4、dd命令
1)dd if=/dev/sdb of=/dev/sdd //将本地的/dev/sdb整盘备份到/dev/sdd
虽然sdb这块硬盘上数据是有限的,但是count会循环一定次数,读完数据为止;
2)dd if=/dev/zero of=/home/ex count=10 bs=10M
bs是输出块的大小,默认单位为字节(Byte),count是输出的次数;即输出10次块为10M的数据,ex文件的大小为100M;注:bs,同时设置读入/输出的块大小为bytes个字节;
如果没有设置count,则会无限循环次数读取,一直把硬盘撑爆,因为zero文件中数据为无穷大
3)增加swap分区文件大小
第一步:创建一个大小为256M的文件:
#dd if=/dev/zero of=/swapfile bs=1024 count=262144
第二步:把这个文件变成swap文件:
#mkswap /swapfile
第三步:启用这个swap文件:
#swapon /swapfile
第四步:编辑/etc/fstab文件,使在每次开机时自动加载swap文件:
/swapfile    swap    swap    default   0 0
4)关于swap空间
当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap中恢复保存的数据到内存中。这样,系统总是在物理内存不够时,才进行Swap交换。 其实,Swap的调整对Linux服务器,特别是Web服务器的性能至关重要。通过调整Swap,有时可以越过系统性能瓶颈,节省系统升级费用。

比如,在linux中打开一个文件但是长时间不编辑也不操作,过了系统默认的时间之后,打开文件的活动进程保存在swap空间中,而且文件也不会被关闭,释放出内存空间供其他正在活动程序进程使用;系统休眠也是把当前所有的进程都保存到swap中;
可以说,swap空间用来保存沉寂的进程,而实际的物理内存用来处理正在活动的进程

5、压缩与解压缩
压缩比率排行xz>bzip2>gzip
gzip -9 /home/ex //压缩比9,且原文件消失,生成ex.gz
gzip -d /home/ex.gz //解压ex.gz,压缩原文件ex.gz消失
gzip -9 ex >aa.gz //压缩比9,原文件保留,利用重定向还可以更改压缩文件名
gzip -dc aa.gz >bb //解压aa.gz,原压缩文件保留,重定向更改解压后的文件名
-c为标准输出,即输出到屏幕;如果不加>bb可见屏幕乱码
6、查询/etc/下大于10k的文件并复制到/home
1)find命令一般格式 //在linux命令格式说明中,[ ]表示可有可无的选项
find pathname -options [-print -exec -ok ...]
pathname:查找路径,.表示当前目录
-option:表示各种选项,例如-type,-user,-name,-size-mtime等
-print:find命令将匹配的文件标准输出,即输出到屏幕
-exec:find命令将匹配的文件,执行-exec参数后边所跟的命令,所跟的命令格式为commond {} \; ,注意{}和\;之间有空格;即find找到所需要的文件后,把find的执行结果交给-exec后面的命令继续处理,{}意思是包含查找结果;如果find找不到所需的文件,则不再继续处理
-ok:和-exec的作用相同,但是在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
查找>100k的文件并移动到指定目录,两种命令:
1)find /usr/local/test/ -type f -size +100k | xargs mv -t /tmp
mv -t 目标目录 原文件 //这样的mv命令也能移动文件
例如:mv -t /home test.txt ;正常情况下:mv test.txt /home
xargs作用:简单理解一下,有些命令不接受管道符处理后的标准输出,如ls;其实xargs就是管道符的一种辅助;并且xargs把前边传递过来的结果分批继续执行,而不是单条执行;
https://www.cnblogs.com/wangqiguo/p/6464234.html
2)find /etc/ -type f -size +10k -exec cp {} /home \; //{}作用是匹配find查找所有结果;即把find查找结果全部包含进去;-exec作用类似于管道符
find /etc/ -type f -mtime +5 //查找5天前的更改数据内容文件,而-5表示5天内更改数据内容的文件;m表示数据内容被更改;还有-ctime,文件状态被更改;-atime表示访问文件
7、echo $SHELL //查看当前shell 而echo $0也是查看当前shell
env //查看当前所有环境变量
8、在脚本中,$$ $0 $n(即$1—$9) $# $ $? $@ $! 的含义如下
$$在脚本中表示脚本执行时的PID号;而不在脚本中表示当前shell的PID,如echo $$;
$0在脚本中表示命令或脚本文件本身;而不在脚本中表示当前shell,如echo $0 ;
$n表示传递给脚本的第n个参数,$1表示第1个参数,如/etc/init.d/mysqld start,这个start就是第1个参数;shell脚本最多可直接同时处理9个参数,即$1—$9;
$#表示传递给脚本的参数个数;(注意:执行脚本时,传递给脚本参数与脚本中是否用到$# $
$n等变量没有绝对关系,如/etc/init.d/mysqld start,没有输出有几个参数和参数是什么;)
$! 表示shell中最后一个进程的pid号
$表示传递给脚本的所有参数;$@与$的含义差不多,但是如果在脚本中$和$@被双引号””包含时,$会将所有参数作为一个整体,以$1 $2 $3 ...形式单行输出所有参数;
而$@将各参数分开,多行罗列把$1 $2 $3 ...输出
例如: 在这里,如果脚本处理的参数超过9个,则以${10}形式括起来
#!/bin/bash
#description canshu
echo "$1 $2 ${10}"
echo "$0"
echo "$*"
echo "$#"
执行脚本:
[root@www practice_scripts]# sh num.sh q w r t y u d d fb rer rer er3
q w rer
num.sh
q w r t y u d d fb rer rer er3
12
9、seq 1 10 //直接输入此命令,输出1—10这10个数,每列1个;可结合for循环语句做取值列表用
10、sleep //设定命令暂停时间; 如sleep 1 和sleep 1s暂停为1秒;sleep 1m 暂停为1分钟;sleep 1h 暂停为1小时
sleep在脚本中的作用,有时写一些监控脚本,在循环语句中需要sleep暂停,以便下条命令暂停执行,防止系统瞬间占用资源过高,导致冲突;补充,在shell的for循环中,可以用for ((i=1; i<=100; i++))循环取值,可以不使用python风格的for i in {1..100}
http://blog.csdn.net/wr339988/article/details/70768499
11、wc test.tex //统计文件中的行数 单词数 字节数
wc -l test.txt //统计文件中的行数;在linux中,换行回车\nr算作一个字节
12、sed -n “s/q/w/g”files.txt //用sed把文件中q字符替换为w,这里-n选项是在命令处理过程中不在屏幕输出任何内容,即安静模式
13、当执行一次bash命令,就会产生一个子shell; export设置全局变量,就是为了子shell能够使用变量
14、date命令
date +%F //年-月-日 格式输出日期;一般在数据备份时加时间戳,引用$(date +%F)变量;如mysqldump -u root -p --all-databases > /root/mysql(data +%F).sql
date +%Y%m%d //年月日 紧密格式输出日期 20180306
15、关于磁盘命令,及磁盘常规修复命令
1)
16、关于sort命令,格式
sort 选项 参数 //参数为要处理的文件,常用来处理日志文件(如web日志访问量最大IP)
原理含义:将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后(比较每行首字符),依次按ASCII码值进行比较(字母按照a—z顺序,不分大小写;数字按照0—9顺序),最后将他们按升序标准输出;如果sort sed.txt -o sed.tex,则不会标准输出,而是把排序结果输出到源文件
选项解释:
-d 忽略每行的空格字符
-u 排序并且有重复的行只的话输出其中1行,然后标准输出; u即unique
-r 反向排序(即降序排序);-o重定向输出到源文件,因为sort 不支持 >>重定向输出
-n按照数字排序,不使用-n时默认数字被作为字符串处理;例如,sed.txt中有第一行10,第二行5,如果不用-n,则会先输出10,然后输出5,因为sort会根据首字符进行比较
-t 指定区域分隔符;即指定把文件中按照哪个字符分成列;
-k指定按照哪块分隔区域的首字符进行排序,即按照哪列首字符进行排序;例如:
[root@www ~]# cat test.txt
12 we:as:ty df
34 rt:34:yu 67
df 90:cv:10 xd
wd 88:66:15 36
[root@www ~]# sort -t : -k 2 test.txt
34 rt:34:yu 67
wd 88:66:15 36
12 we:as:ty df
df 90:cv:10 xd
这里指定了 : 为分隔符,那么这个文件就被分成3列,因为有2个冒号;注意,单独使用-t并没有多大意义;-k就是按照第2列进行排序(是视觉的第3列);如果不适用-t指定分隔符,则-k默认使用空格字符作为区域分隔符
补充:在文件中,域的概念就是指某列
17、uniq命令,格式:
uniq 选项 参数 //参数为要处理的文件,常结合sort命令使用
原理含义:去除文件中的重复行,一般结合sort命令使用
-i 不区分大小写
-c 进行计数,即在每行左侧输出出现的次数,此选项是一般是必加项;例如:
[root@www ~]# cat fi.txt
world:10 99
hello:20 88
linux:30 77
hello:20 88
world:10 99
linux:30 77
world:10 99
hello:20 88
hahah:qw cc
结合sort使用:
[root@www ~]# sort fi.txt | uniq -c
1 hahah:qw cc
3 hello:20 88
2 linux:30 77
3 world:10 99
-d 仅显示文件中重复存在的行;貌似此选项结合sort命令才有效果
[root@www ~]# sort fi.txt | uniq -dc
3 hello:20 88
2 linux:30 77
3 world:10 99
-u 仅显示文件中单独、不重复的行;貌似此选项结合sort命令才有效果
[root@www ~]# sort fi.txt | uniq -uc
1 hahah:qw cc
18、nmap命令
nmap -A -O -PO -vv 网段/IP/域名 //扫描指定主机的OS、端口、MAC等信息

推荐扫描类型:

-PO:主机禁止ping时,可强制扫描

-sU:扫描UDP

-sT:扫描TCP

-p:扫描指定端口 //即 nmap ip -p 端口

19、关于du 和 df命令区别
1)du -sh /etc //统计/etc目录的大小,以兆为单位输出;后边一定要加所统计的对象
2)df -Th //查看硬盘各分区的使用情况,以及百分比
3) df -i //查看硬盘各分区的inode号的使用情况,以及百分比
20、关于/etc/proc目录介绍
Linux系统上的/proc目录是一种文件系统,即proc文件系统。与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息;
此目录下的文件被称作虚拟文件,其中有些文件虽然使用查看命令查看时会返回大量信息,但文件本身的大小却会显示为0字节。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章