shell有什么用
我们输入的命令通过shell与内核kernel进行沟通,然后内核可以控制硬件。
shell的版本
shell有不同的版本,在/etc/shells下可以查看,这些版本的功能都差不多,但在某些语法上有不同。
为什么要将shell写入/etc/shells文件呢?
系统某些服务在运作过程中,会检查使用者能够使用的shells。
Bash Shell的功能
1)bash能够记忆使用过的指令,在家目录的/.bash_history中,记录的是前一次登陆以前执行的命令,而这一次登陆所执行的命令在内存中
2 )使用tab可以进行命令补全功能。
3)命令别名的功能 alias
4)前背景控制:fg,bg命令
5)shell script
6) 通配符,就是使用*可以找到相关的文件。
Bash Shell内建命令
为了方便shell的操作,bash内建了许多命令,可以通过type来查询,直接使用type+命令,type -a 可以列出命令的路径
如果需要删除指令,按快捷键CTRL+U,从光标处开始删除指令
Shell变量
变量名=变量内容
变量名=“变量内容”//可以将变量内容中的变量的内容显示出来
变量名='变量内容'//变量内容中的变量保持不变
如果变量内容含有特殊字符,在特殊字符前加\
变量名=$(变量内容)变量内容是一个指令,变量命名需要指令提供的内容。
变量名=${变量名}变量内容//扩增变量内容
export 变量名 使变量变成环境变量,如果不使用export,则变量只能在当前shell中使用
unset 变量名 取消变量名的设定
echo ${变量名}//显示变量内容
read -pt 变量名//使用键盘输入变量内容,-p 后接提示内容 -t后接秒数,超过秒数将不再设定
declare -aixr 变量名 -a 将变量定义为数组类型,-i 将变量定义为int类型(默认变量为字符串类型) -x 将变量设为环境变量 +x将环境变量设为自定义变量,-r 只读,不能修改
var[index]=变量内容 将变量内容保存在数组中
环境变量
env 观察系统环境变量
RANDOM 随机数生成器,可以生成0-32767之间的数。
如果想要输出0-9之间的数,可以 declare -i number=$RANDOM*10/32768;echo $number;
set 观察所有变量,包括用户定义的变量
$ 变量,这个变量是shell的线程号,可以使用echo $$ 来显示当前shell的PID
? 变量 ,这个变量保存上一个执行的指令的回传的值,执行指令一般都有一个回传值,如果成功执行,则会回传一个0值,否则为非0值。
export 变量名 将自定义变量设为环境变量
locale 系统支持的语系
设定LANG和LC_ALL
限制用户的某些系统资源
ulimit -a //目前身份所有限制数据
ulimit -f 容量 (容量单位为Kbyte) 现在用户只能建立容量一下的文件
限制只有在重新注销登陆后才能取消
变量内容的删除、取代与替换
echo ${原变量名#要被删除的部分} #代表由变量前边开始向右删除,删除最短的那个,要删除最长的可以再加一个#,使用%代表从后向前删除
echo ${变量名/原变量内容/新变量内容} 第一个旧字符串会被取代,在变量名和原变量内容中间加两个/代表全部的旧字符串会被取代
变量名=${变量名-变量内容} 如果之前这个变量名中有内容,则不会替换为新的变量内容,如果没有,则替换为新的变量内容,如果-换为-:则加入原来为空字符串则替换
bash进站欢迎信息
在/etc/issue 中
/etc/issue.net 当使用telnet连接到主机时,主机的登入界面会显示/etc/issue.net
/etc/motd 让登陆者都知道的信息
bash环境配置文件
首先要理解login和non-login,login和non-login登录时读取的环境配置文件不一样,login读取的又分为系统读取的和登录的人读取的,系统读取的是/etc/profile 登录的人读取的是~/.bash_profile或~/.bash_login或~/.profile;有哪个读取哪个,non-login 读取的是~/.bashrc
所以如果我们要修改自己的环境,我们可以修改~/.bash_profile文件.
当我们修改环境配置文件后,我们希望生效,可以使用source命令或.后接配置文件名
其他的一些配置文件
/etc/man_db.conf 与man有关的配置文件,man命令去哪里找.
~/.bash_logout 当注销bash后,系统帮我做完什么动作后离开
bash环境下的通配符
* 代表有无穷个
? 代表1个
[]一定有一个在括号内的字符
[-]在编码顺序中内的所有字符
[^]反向选择
& 将指令变成背景下工作
数据流重导向
> 标准输出 ,以覆盖的方式输出到文件或装置上
>> 标准输出 以累加的方式输出到文件或装置上
2> 标准错误输出
2>> 标准错误输出,以累加的方式
如果想让正确的与错误的数据分别写入到不同的文件
find /home -name.bashrc >list_right 2>list_error
/dev/null 是垃圾黑洞装置,可以将错误数据输出到这个文件中.
如果想让正确与错误数据通通写入同一个文件中,
如果使用这种写法:find /home -name .bashrc >list 2>list 这种写法是错误的,会将正确信息和错误信息交叉写入这个文件
应该使用的写法: find ./home -name .bashrc >list 2>&1 或者 find /home -name .bashrc &>list
< 标准输入,将原来本由键盘输入的数据,改由文件内容来取代
<< 代表结束的输入字符
cat > filename 将键盘输入的内容写入到filename中可以用< 取代键盘的输入,将另外的文件内容输入到文件中
cat > catfile < ~/.bashrc
cat>catfile<<"eof" 当输入eof关键字时,终止输入,不用按ctrl+d
命令执行的判断依据
cmd;cmd 分号前的指令执行完后就会立刻接着执行后面的指令
指令回传值
若前一个指令正确,则在linux底下会回传一个$?=0的值,我们可以透过这个回传值来判断后续指令是否要执行
cmd1&&cmd2 若cmd1正确执行$?=0 开始执行cmd2,若cmd1错误,则不执行cmd2
cmd1||cmd2 若cmd1正确则cmd2不执行,若cmd1错误,则开始执行cmd2
管线命令
cut grep
cut -d '分割字符' -f 数段
-d 后面接分隔字符,与-f一起使用
-f 依据-d的分隔字符将一段讯息分区称为数段,-f取出第几段的意思
cut -c 字符区间
-c 以字符的单位取出固定区间,一般用于处理比较具有格式的输出数据
例如: export | cut -c 12-20 取出12-20之间的字符
grep
grep分析一行,如果一行中有需要的信息,就把这一行取出来
grep -acinv '搜寻字符串' filename
-a 将二进制文件以text文件的方式搜寻数据
-c 计算找到搜寻字符串的次数
-i 忽略大小写的不同,大小写视为相同
-n 顺便输出行号
-v 反向选择
排序命令sort,wc,uniq
sort -fbMnrtuk file or stdin
-f 忽略大小写
-b 忽略最前边的空格
-M 按月份排
-n 使用纯数字排
-r 反向排序
-u 仅出现一行
-t 分隔符
-k 以那个区间排序
uniq -ic
-i 忽略大小写
-c 进行计数
wc 可以统计文件中有多少个字,多少行,多少个字符
wc -lm
-l 仅列出行
-w 列出多少字
-m 多少字符
双向重导向
tee -a file
tee会将数据流分送到文件与屏幕.
字符转换
tr -ds tr可以用来删除一段讯息中的文字,或进行文字替换
-d 删除讯息当中的的文字
-s 取消重复的字符
last | tr '[a-z]' '[A-Z]' 将小写变成大写
col -xb
-x 将tab键转换为对等的空格键
join -ti12 file1 file2 处理两个文件之间的数据,两个文件当中,有相同数据的那一行,才将他加在一起。
-t 后接分割字符,默认以空格分隔,对比第一个字段的数据,如果两个文件相同,则将两笔数据联成一行
-i 忽略大小写
-1 第一个字段要用那个字段分析
-2 第二个字段要用那个字段分析
paste 直接将两行贴在一起,中间以tab键隔开
paste -d file1 file2
expand -t file
-t 后接数字,默认一个tab键用8个空格取代,也可以自己定义一个tab键代表多少个字符。
unexpand 将空格转换为tab键
split 将一个大文件,依据文件大小或行数来分区,就可以将大文件分区成为小文件
-b 后边接欲分区的文件大小,可加单位,b,k,m等
-l 以行数进行分区
xargs -0epn command 产生某个指令的参数,可以读入stdin的数据,并且以空格符或断行符作为分辨,将stdin的资料分隔为arguments
-e 后接一个字符,当xargs分析到这个字符串时,就会停止继续工作。
-n 后面接次数,每次command指令执行时,要使用几个参数的意思
-p 询问使用者
-0 如果输入stdin含有特殊字符,-0将他还原成一般字符。
正则表示法
正则表示法以行为单位进行字符串的处理,透过一些特殊的符号的辅助,让使用者轻易达到搜寻/删除/取代某特定字符。
一般支持正则表示法的命令有grep,awk,sed,vi等
正则表示法与通配符不同,通配符用作操作bash接口,正则表示法则是对字符串进行处理。
对字符排序有影响的语系数据就会对正则表示法的结果有影响,使用正则表示法时要留意当时的语系环境
基础正则表示法
^word 待搜寻的字符串在行首
word$ 待搜寻的字符串在行尾
. 一定有一个任意字符
\ 跳脱字符
* 重复零个到无穷多个的前一个RE字符
[list] 里边列取想要取的字符
[n1-n2] 里边列取想要取的字符
[^list]反向选择
\{n,m\} n-m个前一个字符
sed工具
sed分析stdin,可以将数据进行取代,删除,新增,截取
sed -nefr 动作
-n 来自stdin的数据一般会列在屏幕上,如果加入-n参数后,则只有经过sed特殊处理的那一行才会被列出来
-e 直接在指令列模式上进行sed的动作编辑
-f 直接将sed的动作写在一个文件内。f后接文件名
-r sed的动作支持的是延伸型正规表示法的语法
-i 直接修改读取的文件内容,而不是由屏幕输出
动作:
sed [n1,n2[动作]]
动作:
a 新增,a后面接字符串,而这些字符串会在新的一行出现
c 取代 c后面接字符串,这些字符串可以取代n1,n2之间的行
d 删除
i 插入,i后面接字符串,而这些字符串会在新的一行出现
p 打印 将某个选择的数据打印出。一般与set -n一起
s 取代 可以直接进行取代的工作,通常这个s的动作可以搭配正则表示法
sed进行以行为单位进行部分数据的搜寻并取代的功能。
sed 's/要被取代的字符串/新的字符串/g'
文件的格式化与相关处理
printf ‘打印格式’ 实际内容
\b 退格 \f 清除屏幕 \n输出新的一行 \r enter按键 \t 水平的tab按键 \v垂直的tab按键 \xNN NN为两位数的数字,可以转换数字称为字符。
%ns n是数字,s代表字符串,表示多少个字符
%ni n是数字 ,i代表interger 多少整数字数
%N,nf n与N都是数字,f代表floating
printf '%10s %5i %5i %8.2f \n'$(cat printf.txt|grep -v Name)
awk awk倾向于将一行分成数个字段来处理
awk '条件类型1{动作1}条件类型2{动作2}.....'filename
awk主要是处理每一行的字段内的数据,而默认的字段的分隔符为''空格键‘’或'tab键‘’
awk '{print $1 "\t" $3}' 取出第一个和第三个字段,中间用\t隔开
在awk的括号内,每一行的每个字段都是有变量名的,那就是$1,$2
awk中的变量 NR NF FS
NR 目前处理的第几行数据 NF 每一行拥有的字段总数 FS目前的分隔符,默认是空格键
awk可以使用逻辑运算符
文件对比工具
一般使用到文件对比工具的地方是比较同一个软件包的不同版本之间,比较配置文件与原始档的差异
diff diff通常用在同一文件的新旧版本差异上
diff -bBi 旧文档 新文档
-b 忽略一行当中仅有多个空白的差异
-B 忽略空白行的差异
-i 忽略大小写的不同
cmp
cmp对比两个文件,主要利用字节单位去对比,
cmp -l file1 file2
patch
patch指令一般与diff一起使用,diff对比两个文件的差异,patch将差异文件制成补丁挡,再由补丁挡更新旧文件
diff -Naur oldfile newfile>patchfile.patch(centos 一般没有安装patch软件,要使用前进行安装)
patch -pN<patch_file
patch -R -pN<patch_file
-p 后面接取消几层目录的意思
-R 代表还原,将新文件还原成原来旧的版本
patch -p0<passwd.patch
-p0表示新旧版本在同一个目录下