一、Shell基础
在计算机科学中,Shell俗称壳(用来区别于核),是指“提供使用者使用界面”的软件(命令解析器)。它类似于DOS下的command和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。
1、history:命令历史
!!:执行上一次命令
!$:上一命令的最后一个参数
Ctrl+r:输入关键字查找历史命令
!number:执行指定命令历史中的指定顺序的命令
!vi:执行以vi为开头的最近的命令历史中的一条命令
history -c:清空命令历史【实际就是清空~/.bash_history】
hsitory n:列出包含history n在内的最近n条命令
2、Tab:补全文件或命令
3、alias:别名,主要用于简化命令
alias lin='cd /home'
unalias lin:取消别名
【几个环境配置文件】
~/.bashrc:用户的个人的配置文件,重新打开shell就会执行一次。
~/.bash_profile:
~/.bash_history:
~/.bashrc:
~/.bash_logout:退出终端时执行
/etc/profile:所有用户的环境变量的配置文件
/etc/bashrc:运行bash就会执行
不建议改/etc/bashrc,原因:每打开一个shell就执行一次。做别名这类环境变量的更改时才放入bashrc中。命令的执行一定不要放这里。
4、Shell特殊字符
*:0个或多个任意字符
?:一个任意字符
#:注释
\:脱义符号
~:用户家目录
[]:任选里面的其一
$var:引用变量var的值
``(反引号):先执行反引号内的命令,并用器结果代替该部分
>:重定向
>>追加重定向
2>:错误重定向
2>>:错误追加重定向
<:反向重定向【2.txt < 1.txt:从1中重定向到2】
ls /data >>1.log 2>&1【追加,&1也是1.log】
|:将标准输出作为后一个命令的参数
command &:将前面的命令丢到后台执行
;:命令的逻辑行的结束
&&:与
jobs:查看后台命令
jobs -l:详细查看后台命令,显示PID
Ctrl+z:暂停当前的命令
fg num:恢复指定num的后台命令到前台
bg num:将暂停的命令放入后台运行
Ctrl+c:终止进程
5、变量
默认系统变量用大写,自定义用小写。
env:打印出系统的内置的变量
set:打印出所有的变量,包括自定义的变量
export a=1:全局变量的声明,声明的变量a在子shell中任然保持有效
local b=1:局部变量声明,常用户函数中。使函数的变量作用局限于函数内
变量名规则:a=1.................. 赋值符号左右不能有空格;
变量名命名规则同C
变量的值:有可能需要用''或""包含,注意双引""号中会解析其中的特殊字符
变量可叠加:a=1;b=$a'123':此时$b为1123
unset a:取消变量
6、Shell工具包
1)cut【剪切】
语法:cut -d':' -f3 文件名【指定分隔符,选择第三段】
cut -c4 文件名【选择每行的第4个字符,不能指定分隔符。还可指定区间-c2-10】
2)sort【排序】
语法:sort [参数] 文件名
参数:
-n:指定按照数字排序【默认用的是ASCII码】
-r:reversel反向排序
-u:(uniq)排序时去除重复
-t':' -k3:指定将文件用指定符号分隔后按某一段排序【-t':' -k3,6:指定3-6段都排序】
3)wc【统计】
语法:wc [参数] 文件名
参数:
-l:统计行数
-m:统计字符数,往往多出一个特殊字符
-w:统计单词数
4)uniq【去重】
语法:sort ...|uniq【使用前必须排序】
uniq -c:输出时显示重复的次数。
5)tr【从标准输出读取字符(也就是说要用管道),替换一个或多个字符】
语法:tr [参数] 字符串1 字符串2
参数:
-d:删除字符串1中的所有字符
-s:删除重复出现的字符序列
-c:使用字符串1的补集中的字符替换字符串2,要求为ASCII字符集
空:使用字符串1替换字符串2
6)split【切割文件】【主要目的是把大文件切小,减少查看时的内存占用】
7)tee【重定向加标准输出】语法:split [参数] 文件
参数:
-b5:每个文件5b切割文件
-l10:每个文件10行切割文件
注意:切割后文件名有规律变化
语法:输入 | tee 目的文件
二:正则表达式与强大的正则工具
1、正则表达式
正则表达式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。
在这纠正一个错误:^表示行的起始位置,$表示行的结束位置
2、grep【过滤】【强烈建议做别名:alias grep='grep --color=auto'】
语法:grep [参数] [正则表达式] 文件名
参数:
示例:-v:取反,即过滤出不含正则表达式的行
-c:打印出符合的行数,而不是内容
-n:打印行号
-i:不区分大小写
-q:不输出过滤后的文本结果,只返回真假
-Anum:打印该行及下面的num行
-Bnum:打印该行及上面的num行
-Cnum:打印该行及上面和下面的各num行
grep -r 'root' /etc/*:遍历目录,找出含有正则字符的文件
grep '[0-9]':过滤出包含数字的行。[:digit:]:表示所有的数字
grep -v '^#':过滤以'#'开头的行。【'^#':表示以#开头,'3$':表示以3结尾】
grep -v '^$':去除所有空行。
grep '[^[:digit:]]':过滤出所有非数字开头的行。【[^]:表示取反正则表达式】
grep 'ro.t':过滤出所有符合的行,正则的点表示任一字符
grep的正则符号:
.:任意一个字符
*:表示0个或多个前导字符
-E:扩展正则字符
?:表示0个人或1个前导的字符。
+:表示1个或多个前导字符
():表示将括号内的部分作为一个整体
|:表示或者,即符合|左右两边之一的都行
{}:表示前导符出现的次数【{}内可以是单数字或者范围{2-3}】
3、sed【替换】
语法:sed [参数] '/正则表达式/' 文件名【分隔符//也可用##代替】
参数:
表达式命令:-n:安静模式,和p选项一起输出符合的项目
-i:直接操作文件!!!!!强烈不建议使用,貌似只能在替换时使用
-r:正则表达式不需要脱义
-e:用于连接多个正则表达式,它是一个一个的匹配。也就是可能会出现两次
示例:p:打印
d:删除
s:替换
g:全局作用,常与s同用
sed '15,$'d /etc/passwd:删除15行及以后的行
sed 's/root/ROOT/g' /etc/passwd:将文件中的小写root全部替换为ROOT
sed -n '/root/p ; /gdm/p' 1.txt:用分好间隔多个正则字段
sed -r 's/(^.*)(:.*:)(\/.*$)/\3\2\1/' /etc/passwd:调换顺序,注意表达式中出现间隔符时必须脱义!
sed的正则符号:
-r扩展正则符号:*:表示0个或多个任意字符
.:表示一个任意字符
?:表示
+:表示1个或多个前导字符
():将括号内的字符变为一个整体
3、awk【按段进行操作】
语法:awk [参数] '正则表达式' 文件名
参数:
-F:指定分隔符
示例:
awk -F':' '{print $3'--'$4}' 1.txt:打印指定的段,并在段之间添加普通符号
awk '/root/' 1.txt:过滤指定的字符串root
awk -F':' '$1=="root"' 1.txt:按段精确过滤,数字时不能用引号包围!
awk -F':' '$3=="'$a'"' 1.txt:awk中使用外部变量精确匹配
awk -F':' '$3~/oo/' 1.txt:awk中模糊匹配
awk -F':' '/root/; $1~/lin/; $3~/50/' 1.txt:逗号分隔多个条件。每个条件匹配完再匹配下一条件。有可能会重复...
条件操作符:
awk的逻辑操作符:>:大于
>=:大于等于
==:等于
!=:不等于
<=:小于等于
<:小于
awk -F':' '$7!="/sbin/nologin"' 1.txt:
awk -F':' '$3<$4' 1.txt
awk内置变量:&&:并且
||:或者,区别于逗号。过滤后不会出现重复
awk特殊操作:$0:表示整行
NF:段数
NR:行号
OFS:分隔符
awk -F':' '{print $NF}' 1.txt
awk -F':' '{if ($1~/root/) print $0}' 1.txt:if条件操作
awk -F':' '$2="abc"' 1.txt:赋值操作,非数值加双引【右值可以是某一段】
awk -F':' '{(sum=sum+$3)}; END {print sum}' 1.txt:awk中定义变量
awk -F':' '$1=="root"&&$1="toor {OFS=':' ; print}"' 1.txt:OFS指定操作后的分隔符,赋值后默认分隔符为空格