shell环境设定
shell也是一个应用程序,工作在用户模式,运行表现为一个进程,通过pstree可以查看到bash进程。
shell 进程用于通过命令行界面,类似windows的explore资源管理器。
bourn:开发shell ,bsh-->sh
BSD:研发csh
korn:研发ksh(商业版,功能强大)。
bash-->bourn again shell,Bash-->开源,bsh的增强版
shell本身是解释器,能够理解其他命令,并且让命令执行起来。理解语句,更具流程控制机制让语句按需要执行。
读一句执行一句。
编译器:理解源程序,并且能够将源程序转换成二进制代码后执行。
先将这个源程序转换成二进制格式再执行。
编译器:gcc
解释器:bash python、perl
在编写解释型程序的时候,由于需要解释器进行逐条解释,所有在程序的开头要写明解释器程序的位置。比如:”#!/bin/bash“
变量:内存空间的外在表现,是内存空间名称,用于存储数据。
变量类型:数据存储格式,数据表示范围:
整型:
浮点型:
字符型:
布尔型:
字符:ascii,所有基本字符一共128个,至少需要7bits来表示所有的基本字符。
浮点:单精度,双精度
使用变量的步骤(c、java):
1、声明:给定一个变量类型。
2、声明的同时给其一个初始值,这个过程叫初始化。
3、赋值: int v=2
shell中的 变量
属于弱类型语言:
1、不强制区分变量类型,无论存储什么数据,均默认是字符格式存储。
2、不需要事先声明。直接使用,直接赋值。
定义变量
[set] var_name=value 有空格加“”
引用变量:
${var_name} 通常‘{}’可以省略。{}通常用于对变量所定义数值的扩展
比如: curname=gong
echo “i am $curname”
echo "she is ${curname}ziyan"
撤销变量:
unset var_name
bash变量类型:
本地变量:只对当前shell进程有效,退出登录后无效。
局部变量:对小范围代码段有效。其作用范围不包括当前shell的所有位置。
设置方法:local var_name=value
环境变量:对当前shell及子shell有效(可以通过命令“bash”进入子shell)。
设置方法:export var_name=value
位置变量:$1/$2.........
特殊变量:$$、$!、$?.........
bash变量也可以声明,并指定类型:declare
declare -i var_name:声明一个整型变量。
declare -x var_name:声明一个环境变量。
declare -a var_name:声明一个数组。
bash中如何查看环境变量:
printenv、export
查看所有变量:set
变量的引用:${var_name}
变量替换:只能在双引号中实现。
bash的引号:
双引号:可以实现变量的替换。
单引号:不替换,并且显示字符串本身。
比较:name= 'good dog'
echo this is“$name”
echo this is ‘$name’
反引号:命令引用,引用反引号命令的执行结果。
BingGongtekiMacBook-Pro:~ binggong$ echo "this is `date +%T`"
this is 14:36:47
$( )应用执行结果
BingGongtekiMacBook-Pro:~ binggong$ echo "nihao $(date)"
nihao 2016年10月20日 星期四 14时27分52秒 CST
bash 命令行快捷方式:
ctrl+u:删除命令行首至当前光标所在位置的内容。
ctrl+k:删除当前光标到行尾的内容。
ctrl+a:跳至行首部
ctrl+e:跳至行尾部
ctrl+l:清屏,相当于clear
ctrl+c:终止程序
ctrl+z:将当前命令送至后台执行。
语言控制结构:
1、顺序执行
2、选择执行
3、循环执行
当alias的定义别名与元命令名相同的时候,使用元命令时可以在命令前加\来表示。
文件名通配符
?:用于匹配一个任意字符
*:用来匹配文件名中的任意字符串,匹配长度可以是0-n个
[]:匹配[]内的任意一个字符
-可以表示一个范围[a-z]
[acdf]表示任意一个字符
[!abdf]不匹配括号内adbf的任意字符
多条命令中的逻辑运算符合括号
command1 || command2:逻辑或运算,command1执行成功就不执行command2,否则会执行command2,两者选其一。
command1 && command2:逻辑与运行,command1执行成功才执行command2命令。
(command1;command2):优先执行()内部的命令,并按顺序执行
{command1;command2}:调用子shell命令并执行{}内部的命令,其实质是函数。
正则表达式:命令输出或者文本内容筛选查找。
使用位置:grep、awk、sed、vim
grep:支持基本的正则表达式,只针对文件进行查找工作
egrep:支持扩展正则表达式
tgrep:不支持正常表达式元字符,搜索字符串速度快。
正则表达式是一类字符所书写的模式。
元字符:不表示字符本身的意义,而用于额外功能的描述。通常元字符有两类,一类匹配具体的字符,一类匹配位置,比如行首行尾。
^:瞄定行首的符合条件的字符表达式。 grep --color=auto ^ssh /etc/passwd
$:锚定行尾的符合条件的内容,用法“name$”
^$:空白行
.:匹配任意单个字符。
*:匹配紧挨在其前面的字符任意次数。
[]:配置指定范围内的任意单个字符。
[^]:匹配任意指定范围外的单个字符。
[:lower:]:小写
[:upper:]:大写
[:digit:]:数字
[:space;]:空白字符
\?:匹配紧挨在其前面的字符0-1次。
x\{m,n\}:匹配其前面的字符至少m次,最多n次。
x\{0,n\}:至多n次
x\{m,\}:至少m次
x\{m\}:精确匹配只有m次。
\<:锚定词首,用于定位单词。也可以用\b 比如:\<word
\>:锚定词尾,用于定位单词,表示单词的结尾是指定的内容比如: \>word
\<word\>:完全锚定某一个单词。
\(\):分组,将括号内的当成一个内容使用。当要求后面的内容和前面分组的内容相同时,可以使用\1来表示,1表示第几个分组。
用法:\(parttern\) 例如:grep '\(s.x\).*\1 /etc/passwd
例如:grep '^s\{1,2\}.*' /etc/passwd
grep “[bB].\{2,6\}[tT]”/etc/passwd
grep "[^]"
组合使用正则表达式
grep的选项:
--color=auto 通过修改全局(环境)变量来改变颜色:export GREP_COLOR='01;33'
-v:反向查找,只输出匹配内容以外的行。
-n:在结果输出的同时,输出行号
-i:不区分大小写。
-o:只显示匹配的字符串,而不是整个行。
-A n:显示匹配到的行时,顺带显示器前面的n行
-B n 后面的n行
-C n:前后的n行。
-E:表示扩展正则表达式,可以使用“|”或方式查找,但不支持与方式,所以需要管道重定向来分开查找。
grep -E 'gongbing|liuhaixiang' student.txt
-l:从多个文件中查找,只输出匹配内容的文件名称。
grep -l "root" /etc/*
-h:从多个文件中查找,只输出匹配的内容,不显示文件名称。
grep -h "root" /etc/*
练习:
显示/etc/rc.d/rc.sysinitd中以#开头,并且后面跟一个或多个空白字符,而后又跟了任意非空白字符。
grep '^#[[:space:]]\{1,\}[^[:space:]]' /etc/rc.d/rc.sysinit
1、显示/proc/cpuinfo中的processor开头并且后面跟了一个空字符的行,而后统计相关的行数
2、显示/var/log/secure文件中包含“failed password”或者“failed login”的行;而后统计相关的行数。
3、显示/var/log/secure文件中记录的属于当前系统时间的前一天的信息中包含“failed password”或者“failed login”的行,并统计行数
4、找出netstat -tan 命令执行的结果中以time_wait或者established结尾的行。
显示某文件中的一位数和两位数。
grep ‘\<[:digit:]\{1,2\}\>’/etc/passwd
基本正则表达式:
. \? * \< $ ^ [] \{n,m\} 等。
扩展正则表达式:
.:任意单个字符
[]:指定范围内的单个字符
[^]:取反
*:任意多个
+:匹配其前面的字符至少1次。
?:0或1次
{n,m}:至少m次,至多n次。
():分组,与基本正则表达式不同的是不需要\
a|b:二选其一。
sort:
-f:忽略大小写
-n:以数字大小写排序(默认是以字符方式排序)
-u:排序过程中删除结果相同的行。
-r:降序排列
-R:随机排序。
uniq:选取唯一值。
-c:统计每行重复的次数。
-u:显示没有重复的行
-d:只显示重复过的行
-t:指定分隔符
-k:指定字段
练习:
查找/etc/passwd文件中使用bash的uid最小的用户名
grep 'bash' /etc/passwd |sort -n -t : -k 3 |head -n 1 |cut -d : -f 1
有变量、转义字符的时候需要使用双引号。
bash的配置文件:
profile类:交互式登陆的用户
/etc/profile (全局,对所有用户有效)
/etc/profile.d/*.sh:全局,对所有用户有效,是对profile的补充。
~/.bash_profile:仅对某用户自己有效。
功能:设置环境变量、运行命令和脚本
basher类:非交互式登陆的用户
/etc/bashrc:全局有效
~/.bashrc:仅对用户自己有效。
功能:设置本地变量、定义用户别名
假定新安装jdk文件,可执行命令为/usr/java/latest,需要指定环境变量(全局)JAVA_HOME。如何操作。
vi /etc/profile,也可在/etc/profile.d/新建一个配置文件(java.sh),来进行配置。
添加: export JAVA_HOME=/etc/java/latest
. /etc/profile.d/java.sh 配置生效
echo $JAVA_HOME 查看
在配置文件更新后,新的定义不会立即生效,要想立即生效有两种方式:
1、重启
2、source file
交互式模式就是shell等待你的输入, 并且立即执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、签退。当你签退后,shell也终止了。
shell也可以运行在另外一种模式:非交互式模式,以shell script(非交互)方式执行。在这种模式下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾,shell也就终止了
交互式登陆环境:
1、直接从终端登陆的用户
2、su - username
非交互登陆:
1、su username
2、在图形模式下,打开的一个伪终端。
3、执行脚本
读取bash的顺序:
交互式登陆:
/etc/profile-->/etc/profile.d/*.sh-->~/.bash.profile-->~/.bashrc-->/etc/bashrc 最后执行的优先级高
非交互式登陆:
~/.bshrc-->/etc/bashrc-->/etc/profile.d/*.d
I/O重定向,管道
file disciptor,文件描绘符,FD
标准输入fd:0
标准输出fd:1
错误输出fd:2
将默认数据流改为其他设备,就称为io重定向。
>:覆盖重定向
>>:追加重定向
2>:错误覆盖重定向
2>>:错误追加重定向
ls /usr >/tmp/1 2>/tmp/2 同时对正确和错误的输出进行操作。
&>标准输出和错误输出合并重定向到一个文件
&>>标准输出和错误输出合并追加到一个文件。
输入重定向:
<:输入重定向
<<:此处创建文件。通常用于脚本中文档的生成
cat >/tmp/123 <<eof(eof可任意写)
管道的最后一个命令是在当前shell的子shell中执行的,所有不要用变量获取结果。
t命令可以将重定向和管道结合起来使用,就是在将前一个命令的结果输出到屏幕的同时还可以保存到文件,也就是说可以管道到下一个命令中。
SED 非交互式文本编辑器
命令本身并不会更改源文件内容,如果要将修改结果保存下载,请使用输出重定向
sed逐条读取文件并放到模式空间里,通过编辑命令进行执行并将结果保持到保留空间中。
命令格式:
sed [选项] 命令 文本文件名
选项:
-n:不打印全部内容,默认情况是对文本全部内容输出信息。
-e:连接多条编辑命令
-f:指定脚本文件
编辑命令:
p:打印匹配行
=:显示指定的行号
a\:在定位行号后添加新文本信息,\表示换行
i\:在定位行前添加文本信息
c\:用新文本替换定位位置文本内容
d:删除定位行
s:使用替换模式
r:从另一个文件中读文本并替换
一、查找指定范围
1、x:具体行号
sed -n '2p' /etc/passwd
2、x,y:指定行范围,1,7
sed -n '1,10p' /etc/passwd
3、/pattern/:查找包含模式的行,/disk/
sed -n '/nobody/p' /etc/passwd
4、x,/pattern/:从第n行开始到匹配项之间的所有内容
sed -n '/nobody/,$p' passwd
5、/pattern/,y:从匹配内容开始向下到第n行。
sed -n '1,/nobody/p' passwd
6、x,y!:排除指定的范围
sed -n '1,30!p' passwd
7、1,$:显示所有行
8、$:打印最后一行
sed -n '$p' passwd
二、打印行号
1、查找passwd文件中的包含gong用户的所在行号
sed '/gong/=' passwd
三、插入、替换指定内容
1、在passwd文件,包含root的行后插入###############。
sed '/root/'a\ "###########" passwd
2、在passwd文件,包含root的行前插入###############。
sed '/root/'a\ "###########" passwd
3、在passwd文件,包含root的行替换为###############。
sed '/root/'c\ "############" passwd
4、在passwd文件,删除###############。
sed "/####/"d passwd
四、替换文本
s/paterntofind/newpartern/[gpwn]
同i\a\的区别主要是:
i、a替换的是整行,而s替换的查找到的具体内容。
选项
g:全局查找替换所有符合的模式
1、替换passwd文件中的gongbing 为liuhaixing
sed 's/gongbing/liuhaixiang/g' passwd
2、删除passwd文件中的root
sed 's/root//g' passwd
&:表示对前一个模式所指的内容进行重新引用
比如: sed 's/gongbing/bingle &/g' passwd 表示在gongbing的前面添加一个bingle字符串。
显示文本文件的控制字符
1、cat -v passwd
2、sed '1.$l' passwd l:小写l表示显示控制符
五、删除行
d:用来删除匹配的行。
sed ‘/^28/d’ /etc/passwd
删除文件中以28开头的行。
sed -ne ‘/[Ll]ixia/d’-e '/shanghai/d' -e p students
多匹配内容之间的删除操作需要-e的配合。
元字符终极总结
字符(Characters)
字符组(Character classes)
元字符(Metacharacter) 匹配(Matches)
[abc] simple class 匹配 a 或 b 或 c
[^abc] negation 匹配 abc 之外的任何单个字符
[a-zA-Z] range匹配a到z或A到Z的任何单个字 符
[a-d[m-p]] union 等同于[a-dm-p]
[a-z&&[def]] intersection 匹配 d, e 或 f
[a-z&&[^bc]] subtraction 等同于[ad-z]
预定义字符组(Predefined character classes)
元字符(Metacharacter) 匹配(Matches) |
. dot 任何字符,能不能匹配换行符取决于匹配 模式 |
\d digit 数字,等价于[0-9] |
\D non-digit 非数字,等价于[^0-9] |
\s whitespace 空白字符,等价于[ \t\n\x0B\f\r] |
\S non-whitespace 非空白字符,等价于[^\s] |
\w word 组成单词的字符,等价于[a-zA-Z_0-9] |
\W non-word 不是组成单词的字符,等价于[^\w] |
POSIX 字符组
元字符(Metacharacter) 匹配(Matches)
[:lower:]: 小写
[:upper:]: 大写
[:digit:]: 数字
[:space;]: 空白字符
零长度断言
元字符(Metacharacter) 匹配(Matches)
^ caret 行首
$ dollar 行尾
\b boundary 单词边界
\B 非单词边界
\< 单词的起始位置
\> 单词的结束位置
\A 字符串起始位置
\Z 字符串结束位置
\z 字符串结束位置
\G 次匹配的起始位置或上次匹配的结束 位置
(?=...) positive lookahead 如果右边能够匹配,则成功
(?!...) negative lookahead 如果右边不能够匹配,则成功
(?<=...) positive lookbehind 如果左边能够匹配,则成功
(?<!...) negative lookbehind 如果左边不能够匹配,则成功
贪婪量词
元字符(Metacharacter) 匹配(Matches)
X? 匹配 X 0次或1次
X* 匹配 X 0次或无数次
X+ 匹配 X 1次或无数次
X{n} 匹配 X n 次
X{n,} 匹配X 至少n次
X{n,m} 匹配X 至少n次至多m次
非贪婪量词
元字符(Metacharacter) 匹配(Matches)
X?? 匹配X0次或1次
X*? 匹配X0次或无数次
X+? 匹配X1次或无数次
X{n}? 匹配Xn次
X{n,}? 匹配X至少N次
X{n,m}? 匹配X只是N次至多M次
占有量词
元字符(Metacharacter) 匹配(Matches)
X?+ 匹配 X 0次或1次
X*+ 匹配 X 0次或无数次
X++ 匹配 X 1次或无数次
X{n}+ 匹配 X n 次
X{n,}+ 匹配X 至少n次
X{n,m}+ 匹配X 至少n次至多m次
分组,捕获及后向引用
元字符(Metacharacter) 匹配(Matches)
(...) 分组或捕获
\n 引用第 n 个括号中匹配的内容
(?<name>...) 命名捕获
(?:...) 分组
(?>...) 固化分组
多选结构
元字符(Metacharacter) 匹配 (Matches)
a|b|c 匹配 a 或 b 或 c
条件判断
元字符(Metacharacter) 匹配(Matches)
(?if then |else) | 条件为真,则匹配 then 子表达式,否则匹配 else 子表达式 |
匹配模式
元字符(Metacharacter) 匹配(Matches) |
(?i:...) 不区分大小写的匹配模式 |
(?x:...) 注释模式 |
(?s:...) 单行模式(点号通配模式) |
(?m:...) 多行模式(增强的行锚点模式) |
\Q...\E 文字文 模式 |