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

来源:互联网 发布:传智播客刘意java视频 编辑:程序博客网 时间:2024/06/04 01:33

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[n]w,c[n]b,c[n]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输入字段分隔符 默认是空格或TabNF当前记录中的字段个数,就是有多少列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.txtawk '{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 嵌套ifsub 匹配第一次出现的字符串,相当于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".


额··就这些吧···


 




原创粉丝点击