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

shell脚本一个分享,直接粘贴过来

2013-11-22 18:59 351 查看
Shell是什么?

程序开发语言,分为两种,一种是解释型语言,一种是编译型语言。解释型语言是解释语句,并且能根据流程控制机制让语句按需执行,解释一条语句就返回语句的结果,这种语言需要一个解释器,而linux中的bash就是这样的一个解释器,常见的解释型语言有perl,python,ruby,bash。编译型语言,首先需要编译源程序,并且能够将源程序转换为二进制格式,而后让其执行,这种语言需要一个编辑器,如linux下的gcc就是一个编辑器,编译型语言有C,C++,C#等。
一:来点猛料
1)用好history

① !!,!-1,Ctrl+p:最近一次的输入
② ! n,:执行历史记录编号为n的记录
③ Ctrl+r:进入历史命令搜索模式
④ !Command:执行最近的Command命令
!Command:p 仅打印不执行
⑤ !$/!*:上一条命令的最后一个/所有参数,有:p,等于Emacs下的Alt+.
⑥ !Command:n:获取最近command命令的第n个参数,最后一个用$,有:p
⑦ ^cp:删除上一条命令的cp,无:p
^cp^cd:将上一条命令的第一个cp替换为cd
^cp^cd^: 将上一条命令的所有cp替换为cd
① HISTCONTROL:ignoredups,erasedups 忽略命令行模式
配置
② HISTSIZE:设置历史记录的数量
③ HISTTIMEFORMAT:设置历史记录显示时间的模式(%F%D,%Y%m%d%H%M%S)
2)启动vi模式

①像使用vi一样使用
       只需要简单一步,就可以把命令行输入行变成vi编辑器,当然,只能使用vi编辑器里面的单行编辑命令。
set -o vi
再按下Esc,
移动:bB,eE,wW,^$,
删除:xX,c
w,c
b,c
e,dd,cc,
回退和修改:Uu,Rr
3)启动变态的Emacs模式

①移动光标快捷键
ctrl+f 向前移动一个字符
ctrl+b 向后移动一个字符
alt+f 向前移动一个单词
alt+b 向后移动一个单词
ctrl+a 移动到当前行首
ctrl+e 移动到当前行尾
ctrl+l 清屏,并在屏幕最上面开始一个新行

②编辑命令行快捷键

ctrl+d 删除当前的字符
ctrl+t 交换当前字符和前一个字符的位置
alt+t 交换当前单词和前一个单词的位置
alt+u 把当前单词变成大写
alt+l 把当前单词变成小写
alt+c 把当前单词变成首字母大写的单词
ctrl+v 添加一个特殊字符,例如,要添加一个制表符,按ctrl+v+tab
③剪切、粘贴快捷键
ctrl+k 剪切文本直到行的末尾
ctrl+u 剪切文本直到行的起始
ctrl+w 剪切光标前的单词
alt+d 剪切光标后的单词
ctrl+y 粘贴最近剪切的文本
alt+y 回退到先前剪切的文本并粘贴它
ctrl+c 删除整行

二:一些常用命令
1)查找

①whereis:找命令在哪里
②locate:=find -name,快,放在本地数据库,
每天更新,updatedb立即更新数据库
②locate:=find -name,快,放在本地数据库,
每天更新,updatedb立即更新数据库
③find:强大的找文件命令
-name  $find . -name 'my*'
-size    $find . -size +10000000c
+/-:大/小于,c是byte
-amin   $find . -amin -1 -and -size -10c
1分钟内被访问过且小于10byte的文件amin访问过,mmin修改过,cmin文件状态改变过;amin,mmin,cmin精确到分钟,mtime, mtime,ctime精确到天;在5分钟之内的用-5,在5分钟以上的用+5;-and/-or,交集/并集

④grep:强大的找文件内容命令
-i:不区分大小写,默认区分大小写,
-l:只列出匹配的文件名
-L:列出不匹配的文件名
-r:递归查找; -c:该文件匹配个数
-n:匹配出现的行数
-w:只匹配整个单词,而不是字符串的一部分
-C number:匹配的上下文分别显示number行
\<,\>:分别标注单词的开始与结尾
^,$:指匹配的字符串在行首,行尾

2)处理和展示文本
①cut:简单的截取
-b:按照byte截取
-c:按照char截取
-f:按照field域截取,默认是分割符是tab
-d " "指定分割符为" "
-s不包括那些不含分隔符的行(这样有利于
去掉注释和标题)
$cut -f 1-1 -d " " -s uniq.txt
$echo hello world|cut -c 1-2
指定范围:n-m,n到m;-m,开始到m;n-,n到结束
②sed:强大的行编辑器
sed是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等
$sed "s/m/y/g" a.txt > b.txt (-i直接修改)
匹配规则可以直接用正则表达式,如:^,$,/<,/>,.,*,[]   如果冲突了/可以用其他符号代替
$sed "s/m/y/g" a.txt > b.txt
$sed "3,6s/m/y/g" a.txt > b.txt 替换3到6行
$sed "s/m/y/1" a.txt      替换第一个,g:所有
$sed "s/m/y/1;s/y/m/2" a.txt   联合使用
$sed "s/m/&y/1" a.txt     &指被匹配的m
$sed 's/This is my \([^,]*\),.*is \(.*\)/\1:\2/g' my.txt   圆括号匹配
N: 把下一行的内容纳入当成缓冲区做匹配。
$sed 'N;s/\n/,/' a.txt        把两行合并成一行
$sed 'N;s/m/,/' a.txt    把两行中第一个m替换
a,i,c,d,p:append,insert,change,delete,打印行
$sed "/my/a ----" a.txt   匹配的行插入----
$sed "2 c ----" a.txt       修改第二行
$sed "2,$c ----" a.txt 修改第二行到最后一行
$sed -n "/my/p" a.txt  只打印匹配的行
[address[,address]][!]{cmd}  !表示匹配成功不执行命令
$sed '/m/,+3s/^/# /g' a.txt  后续连续三行加#
$sed '3,6 {/m/{/y/d}}' a.txt 对3行到第6行,匹配/m/成功后,再匹配/y/,成功后执行d命令
b lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
$sed "/m/n;s/y/1/;:n;" a.txt 有m就跳到n,不执行替换


③awk: 强大的行编辑器和处理,还是一个脚本语言
$awk '{print $1}' a.txt 打印第一列,tab分割
$awk '{printf "%02s" $1}' a.txt 格式化输出
$awk '$1>0 && $2=="m" {print $1}' a.txt 条件
$awk '$1>0 && $2=="m" || NR==1' a.txt 表头
$0 当前记录(这个变量存放着整个行的内容)
$1~$n 当前记录的第n个字段,字段由FS分隔
FS 输入字段分隔符 默认是空格或Tab
NF 当前记录中的字段个数,就是有多少列
NR 已经读出的记录数,就是行号,从1开始,如果有多个文件话,这个值也是不断累加中
FNR 当前记录数,与NR不同的是,这个值会是各个文件自己的行号
RS 输入的记录分隔符,默认为换行符
OFS 输出字段分隔符,默认也是空格
ORS 输出的记录分隔符,默认为换行符
FILENAME 当前输入文件的名字
$awk '$6 ~ /m/ || NR==1 {print NR,$4}' a.txt$awk '$6 !~ /m/ || NR==1 {print NR,$4}' a.txt
awk '{print > $6}' a.txt 拆分表单
$awk '{print $3,$4>$6}' a.txt拆分,输出指定列
$awk 'NR!=1{if($6 ~ /TIME|ESTABLISHED/) print > "1.txt";else if($6 ~ /LISTEN/) print > "2.txt";else print > "3.txt" }' a.txt 嵌套if
sub 匹配第一次出现的字符串,相当于sed 's///'
gsub 匹配所有的字符串,相当于 sed 's//g'
sub 匹配第一次出现的字符串,相当于sed 's///'
gsub 匹配所有的字符串,相当于 sed 's//g'
$awk '{sub(/Mac/,"MacOS",$1);print}' a.txt
$awk '{gsub(/Mac/,"MacOS",$1);print}' a.txt
$awk 'BEGIN{ system("ls -l") }' 可以直接调用系统命令
$ls -l *.c *.h |awk '{sum+=$5} END {print sum}' 计算文件大小
$awk 'NR!=1{a[$6]++;} END {for (i in a) print i ", " a[i];}' a.txt 统计功能
$ps aux | awk 'NR!=1{a[$1]+=$6;} END { for(i in a) print i ", " a[i]"KB";}' 统计功能,使用数组

三 默认规则

$0:脚本自身名称
$1:第一个参数,$n第n个参数
$@:所有位置参数的列表
$*:所有位置参数
$#:位置参数的个数
-b file 检查文件是否存在且是一个块特殊文件
-c file 检查文件是否存在且是一个字符文件
-d file 检查file是否存在并且是一个目录
-e file 检查文件是否存在
-f file 检查文件是否存在并且是一个文件
-h file 检查文件存在且为一个符合链接
-N file 从文件上一次被读取到现在为止, 文件是否被修改过
-r file 检查文件是否存在并且可读
-s file 检查文件是否存在且不为空
-t file 文件(描述符)被关联到一个终端设备上, 这个测试选项一般被用来
检测脚本中的stdin([ -t 0 ])或者stdout([ -t 1 ])是否来自于一个终端.
-w file 检查文件是否存在且可写
-x file 检查文件是否存在且可执行
-O file 检查文件是否存在且别当前用户拥有
-G file 检查是否存在并且默认组是否为当前用户组
f1 -nt f2 文件f1比文件f2新
f1 -ot f2 文件f1比文件f2旧
f1 -ef f2 文件f1和文件f2是相同文件的硬链接
-z $var 字符串为"null", 意思就是字符串长度为零
-n $var 字符串不为"null".

额··就这些吧···

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息