导图社区 学习 shell 与 shell script
linux初探第三部分 学习 shell 与 shell script知识总结,包括vim 程序编辑器、认识和学习bash、正则表达式与文件格式化处理等内容。
编辑于2021-11-13 12:05:30云计算中的部分存储基础知识整理,包括:开源企业存诸freenas、Account、storage、Sharing。
网络基础知识思维导图,主要内容有网络范围、网络模型(标准)、单位、数据发送方式、数据包装格式、网络层IP协议、网络设备路由器/交换机设置。
这是一篇关于第五部分 Linux 系统管理员的思维导图,从chapter 20 启动流程、模块管理与Loader、内核与内核模块、内核模块查看、initrd的重要性与创建initrd文件、内核功能中的vga设置、init配置文件错误等内容,总结的非常细致全面。
社区模板帮助中心,点此进入>>
云计算中的部分存储基础知识整理,包括:开源企业存诸freenas、Account、storage、Sharing。
网络基础知识思维导图,主要内容有网络范围、网络模型(标准)、单位、数据发送方式、数据包装格式、网络层IP协议、网络设备路由器/交换机设置。
这是一篇关于第五部分 Linux 系统管理员的思维导图,从chapter 20 启动流程、模块管理与Loader、内核与内核模块、内核模块查看、initrd的重要性与创建initrd文件、内核功能中的vga设置、init配置文件错误等内容,总结的非常细致全面。
Linux
第三部分 学习 shell 与 shell script
chapter 10 vim 程序编辑器
vi 的三种模式
一般模式
操作
光标移动
h 或向左箭头(←)
光标向左移动一个字符
n+h/←
光标向左移动 n 个字符
j 或向下箭头(↓)
光标向下移动一个字符
n+j/↓
光标向下移动 n 个字符
k 或向上箭头(↑)
光标向上移动一个字符
n+k/↑
光标向上移动 n 个字符
l 或向右箭头(→)
光标向右移动一个字符
n+l/→
光标向右移动 n 个字符
Ctrl + f
屏幕向下移动一页,相当于 Page Down
Ctrl + b
屏幕向上移动一页,相当于 Page Up
Ctrl + d
屏幕向下移动半页
Ctrl + u
屏幕向上移动半页
+
光标移动到非空格符的下一行
-
光标移动到非空格符的上一行
n+space
光标会向右移动这一行的 n 个字符
0 或 Home
移动至行首
$ 或 End
移动至行尾
H
光标移动至屏幕最上方那一行的行首
M
光标移动至屏幕中间行的行首
L
光标移动至屏幕最下方那一行的行首
G
移动至文件的最后一行
nG
直接定位移动,移动至文件的第 n 行
gg
移动至文件的第一行,相当于 1G
n+Enter
光标向下移动 n 行
查找与替换
/word
向下查找 word 字符串
?word
向上查询 word 字符串
n
代表重复上一个查找动作
e.g:前一个查找是 /word 则按下 n 继续向下查找 word;若前一个查找是 ?word 则按下 n 继续向上查找 word
N
与 n 相反,“反向”进行前一个查找动作
e.g:若前一个查找是 /word (向下查找)则按下 N 会向上查找 word;若前一个查找是 ?word (向上查找)则按下 N 会向下查找 word
:n1,n2s/word1/word2/g
n1 和 n2 为数字,在 n1 与 n2 行之间查找 word1字符串并将查找到的字符串替换成 word2
:1,$s/word1/word2/g
从第一行到最后一行查找 word1字符串,并将该字符串替换为 word2
:1,$s/word1/word2/gc
从第一行到最后一行查找 word1字符串,并将该字符串替换为 word2,在替换前显示提示字符给用户确认(confirm)是否替换
删除、复制与粘贴
x,X
行中删除字符
x 向后删除一个字符(相当于 del 键)
X 向前删除一个字符(相当于 backspace)
nx
连续向后删除 n 个字符
dd
行删除,删除光标所在行
ndd
删除光标所在向下的 n 行
e.g:20dd 删除20行
d1G
删除光标所在行到第一行
dG
删除光标所在行到最后一行
d$
删除光标所在位置到行末的数据
d0
删除光标所在位置到行首的数据
yy
复制光标所在行
nyy
复制光标所在向下 n 行
y1G
复制光标所在行到文件第一行
yG
复制光标所在行到文件最后一行
y0
复制光标所在位置到该行行首的数据
y$
复制光标所在位置到该行行尾的数据
p,P
粘贴数据
p 将已复制的数据粘贴到光标下一行
P 将已复制的数据粘贴到光标上一行
其他
J
将光标所在行与下一行的数据结合成一行
c
重复删除多个数据,e.g:向下删除10行:10cj
u
复原前一个操作
Ctrl+r
重做上一个操作
.(小数点)
重复前一个操作
编辑模式
i/I
一般模式按下 i/I 进入插入编辑模式
i 为从目前光标所在处插入
I 为在目前所在行第一个非空格符处插入(行首插入)
a/A
一般模式按下 a/A 进入插入编辑模式
a 为从目前光标所在处的下一个字符开始插入
A 为从光标所在行的最后一个字符处开始插入(行末插入)
o/O
一般模式按下 o/O 进入插入编辑模式
o 为在目前光标所在处的下一行插入新的行(新起一行插入)
O 为在目前光标所在处的上一行插入新的行(上一行插入)
r/R
一般模式按下 r/R 进入替换编辑模式
r 只会替换光标所在处的那一个字符一次
R 会一直替换光标所在的文字,直到按下 Esc 为止
命令行模式
:w
将编辑的数据写入硬盘文件中
:w!
若文件属性为只读时,强制写入文件,不过最终能否写入跟用户对文件的权限有关
:q
离开 vi
:q!
若修改过文件又不想保存,使用 !强制离开不保存
:wq
保存后离开,若为 :wq! 则强制保存后离开
ZZ
若文件没有更动,则不保存离开;若文件已被更动过,则保存后离开
:w[filename]
将编辑的数据保存为另一个文件(类似于另存文件)
:r[filename]
在编辑的数据中,读入另一个文件数据,即将 filename 这个文件加到光标所在行后面
:n1,n2 w [filename]
将第 n1 到 n2 行的内容保存成 filename 文件
:! command
暂时离开vi 到命令行下面执行 command 的显示结果
e.g: :! ls /home 即可在vi 当中查看/home 下面以 ls输出的文件信息
:set nu
显示行号
:set nonu
取消行号
三种模式关系

块选择
v
字符选择,会将光标经过的地方反白选择
V
行选择,会将光标经过的行反白选择
Ctrl+v
块选择,可以用长方形的方式选择数据
y
复制反白的地方
d
删除反白的地方
多文件编辑
vim file1 file2 filen
:n
编辑下一个文件
:N
编辑上一个文件
:files
列出目前 vim 打开的所有文件
多窗口编辑
:sp [filename]
如果有 filename,表示在新窗口打开一个新文件,否则表示两个窗口为同一个文件内容
窗口间的移动选择
Ctrl+w+j/Ctrl+w+↓
光标移动到下一个的窗口
按法:按下Ctrl+w 松开在按 j 或者向下箭头
Ctrl+w+k/Ctrl+w+↑
光标移动到上一个窗口
按法一样
Ctrl+w+q
离开关闭某一个窗口,先将光标移动到要离开的窗口,按下 Ctrl+w 松开再按 q
vim 环境设置与记录
~/.viminfo
记录所有你通过 vim 所做过的行为的文件
~/.vimrc
vim 环境设置文件,自行创建;系统整体的vim设置值在 /etc/vimrc 中,不建议修改它

DOS 与 Linux 的断行符
cat -A 查看文件特殊格式
DOS(windows)
^M$,称之为 CR(回车)与 LF(换行)
Linux
仅有 LF($)
断行格式转换
dos2UNIX [-kn] file [newfile]
将 DOS(windows) 的断行格式转换为 Linux 的格式
UNIX2dos [-kn] file [newfile]
将 Linux 的断行格式转换为 DOS 格式
-k 保留该文件原本的 mtime 时间格式(不更新文件上次内容被修改的时间) -n 保留原本的旧文件,将转换后的内容输出到新文件 e.g: dos2UNIX -n old new

语系编码转换
iconv --list
--list 列出 iconv 支持的语系数据
iconv -f 原本编码 -t 新编码 filename [-o newfile]
-f:from,后接原本的编码格式
-t:to,后接新的编码格式
-o file:若要保留原来的文件,使用 -o 新文件名可以建立新编码文件
chapter 11 认识和学习 bash
shell
一个特殊的应用程序(接口),提供给用户(通过命令)与内核通信,让内核控制硬件完成用户所需的任务。只要能操作应用程序的接口均能称为 shell
广义
图像界面软件
狭义
命令行界面的软件 (bash)
命令行界面的 shell
why to learn?
1.大家都一样,不同 distributions的 bash都一样,所谓“一法通,万法通”
2.远程联机管理,命令行界面快
3. linux 任督二脉,主机管理所必须
shell history
Steven Bourne
Bourne shell,简称 sh
基于GNU架构发展对Bourne Shell 的增强版(Bourne Again SHell),简称 bash
柏克莱大学 Bill Joy
C shell,简称 csh
linux 可使用的 shell
存放位置:/etc/shells
/bin/sh,已被 /bin/bash 替代
/bin/bash , linux 默认的 shell
/bin/ksh
/bin/tcsh
/bin/csh, 已被 /bin/tcsh 替代
/bin/zsh

系统上合法的 shell 为什么要写入 /etc/shells 文件?
系统某些服务在运行过程中会去检测用户所能使用的shells,而这些shell的查询需要借助/etc/shells文件
bash
优点:
命令记忆功能(history)
记录位置:~/.bash_history
命令与文件补全功能(Tab)
Tab 接在一串命令的第一个字后面为命令补全
Tab 接在一串命令的第二个字后面为文件补全
命令别名设置功能(alias)
作业控制、前台、后台控制(job control/foreground/background)
程序脚本(shell script)
通配符
判断命令是否为bash的内置命令?
type
type [-tpa] name
不加参数会显示name是外部命令还是bash内置命令
加入 -t 参数,type 会将name以以下字眼显示其意义
file,表示为外部命令
alias,表示该命令为命令别名所设置的名称
builtin,表示该命令为bash内置命令
-p,如果name为外部命令,则显示完整文件名
-a,由PATH变量定义的路径中,将所有含有name的命令列出来,包含alias
命令换行
使用“\”转义,\[enter]
shell 的变量功能
影响bash环境操作的变量(环境变量)
区别于自定义变量,环境变量要大写 PATH/HOME/MAIL/SHELL
变量显示与设置
显示变量
echo $变量名/echo ${变量名}

设置变量
设置规则:
变量与变量内容等号(=)连接
等号两边不能直接接空格符
变量名称只能是英文字母和数字,开头字符不能为数字
变量内容若有空格符,使用双引号或单引号括起来
双引号内特殊字符$等,可保有原本特性
单引号内特殊字符则仅为一般字符
可使用转义字符将特殊符号(enter/$/\/空格符/!等)变成一般字符
命令中包含其他命令的结果,使用反单引号:`命令` 或者 $(命令)
增加变量内容: 使用"$变量名称"或者 ${变量}累加内容
一般变量变成环境变量,使用 export, export PATH
取消变量: unset 变量名称

环境变量
查看环境变量
env
HOME
用户主文件夹
SHELL
目前环境使用的shell是哪个程序,linux默认使用/bin/bash
用户使用mail命令收取信件时系统会读取的邮件信箱文件
HISTSIZE
设置历史命令记录的条数
PATH
执行文件查找路径,目录与目录之间以冒号(:)分割
LANG
语系
中文编码:zh_CN.gb2312/zh_CN.UTF-8
RANDOM
随机数变量
随机数生成器:/dev/random 文件
范围:0~32767
0~9 随机数:declare -i number=$RANDOM*10/32768

export
自定义变量转成环境变量,两者差异在于该变量是否会被子进程所继续引用
父进程
登录linux所取得的bash,是一个独立的进程
子进程
bash 下面所执行的任何命令
子进程仅会继承父进程的环境变量,不会继承父进程的自定义变量
查看所有变量,含环境变量和自定义变量
set
HISTFILE
历史命令记录的放置文件,隐藏文件
MAILCHECK
代表每隔多少秒去扫描一次信箱有无新信
PS1
命令提示符
命令提示符设置
\d
显示出“星期月日”的日期格式,eg: Mon Feb 2
\H
完整主机名
\h
仅取主机名在第一个小数点之前的名字
\t
24小时格式显示时间:HH:MM:SS
\T
12小时格式显示时间:HH:MM:SS
\A
24小时格式显示时间:HH:MM
\@
12小时格式显示时间:am/pm
\u
当前用户名称
\v
bash版本信息
\w
完整工作目录名称
\W
利用basename函数取得的工作目录名称,仅会列出最后一个目录名
\#
代表执行的第几个命令
\$
提示符, root 为#,一般用户$

PS2
使用转义符号,第二行后的提示符
$
当前shell使用的PID
echo $$
?
命令执行回传码
上一个命令成功执行,回传0
执行过程发生错误,回传错误代码,非0数值
语系变量
locale
查询系统支持了多少语系
整体系统默认的语系定义:/etc/sysconfig/i18n
变量键盘读取、数组与声明
键盘读取变量
read
read [-pt] variable
-p 后面接提示信息
-t 后面接等待的秒数

数组
var[index]=content
var 数组名
index 索引数字
content 内容
读取数组
${数组}

声明
declare/typeset,两个功能一样,声明变量类型
declare [-aixr] variable
-a 将名为variable的变量定义成数组(arry)类型
-i 将名为variable的变量定义成数组(integer)类型
-x 与export一样,将variable 变成环境变量
-r 将变量设置为readonly类型,变量内容不可更改,不可重设,变量被设置为只读,若要恢复变量原来类型需要注销再登录
ulimit
限制用户的某些系统资源,包括可以打开的文件数量、可以使用的CPU时间、可以使用的内存总量等
ulimit [-HSaftu] [配额]
-H hard limit,必定不能超过这个设置的值
-S soft limit,警告设置,可以超过,超过则有警告信息
-a 后面不接任何参数,列出所有的限制额度
-f 此shell可以创建的最大文件容量,单位KB
-d 进程可使用最大断裂内存容量
-t 可使用最大CPU时间,单位s
-u 单一用户可使用最大进程数量

变量内容删除、替代与替换
删除
${变量#关键字}
由变量的最前面开始向后删除,删除到与关键字符合的最短数据位置结束
${变量##关键字}
由变量的最前面开始向后删除,删除到与关键字符合的最长数据位置结束
${变量%关键字}
由变量的最后面开始向前删除,删除到与关键字符合的最短数据位置结束
${变量%%关键字}
由变量的最后面开始向前删除,删除到与关键字符合的最长数据位置结束

替换
${变量/旧字符串/新字符串}
一条斜线,替换一次
${变量//旧字符串/新字符串}
两条斜线,全部替换

变量的测试与内容替换
var=${str-expr}
str 没有设置
var=expr
str 设置为空
var=
str 已设置且不为空
var=$str
var=${str:-expr}
str 没有设置
var=expr
str 设置为空
var=expr
str 已设置且不为空
var=$str
var=${str=expr}
str 没有设置
var=expr,str=expr
str 设置为空
str不变,var=
str 已设置且不为空
str不变,var=$str
var=${str?expr}
str 没有设置
expr输出至stderr
str 设置为空
var=
str 已设置且不为空
var=$str

命令别名与历史命令
命令别名设置
alias
直接执行alias命令,查看所有命令别名
定义:
alias 别名='命令参数' ,eg: alias lm='ls -al | more'/alias rm='rm -i'
unalias
取消命令别名
eg: unalias lm
清屏
DOS:
cls
Linux:
clear
历史命令: history
history [n]
n 为数字,列出最近的 n 条命令
history [-c]
将目前shell中所有history内容全部清除
history [-raw] histfiles
-a 将目前新增的history命令新增入histfiles中,若没有histfiles则默认写入~/.bash_history
-r 将histfiles的内容读到目前这个shell的history记忆中
-w 将目前history记忆内容写入到histfiles中
协作命令
!number
执行第 number 条命令
!command
搜寻命令串开头为 command的那个命令并执行
!!
执行上一个命令
Bash Shell 的操作环境
命令运行顺序:
1.以相对/绝对路径执行命令,eg: /bin/ls 或 ./ls
2.由alias找到命令来执行
3.由bash内置(builtin)的命令来执行
4.通过 $PATH这个变量的顺序找到的第一个命令来执行
/etc/issue
bash登录界面信息
设置
\d
显示本地端时间的日期
\l
显示第几个终端机接口(小写的L)
\m
显示硬件等级(i386/i486/i586/i686...)
\n
显示主机的网络名称
\o
显示domain name
\r
操作系统的版本(uname -r)
\t
显示本地端时间的时间
\s
操作系统名称
\v
操作系统版本

/etc/issue.net
提供给telnet远程登录程序用,使用telnet连接到主机时,登陆界面显示的就是/etc/issue.net的内容而非/etc/issue
/etc/motd
该文件内容会在用户(包括所有的一般账号和root)登录主机后显示一个欢迎信息
bash 环境配置文件
login shell
通过完整的登录流程(输入用户账号和密码)取得的bash
e.g: tty1~tty6
读取的配置文件:
/etc/profile
系统整体的设置(最好勿动),每个用户登录取得bash一定会读取的配置文件
可设置变量
PATH
会依据UID决定PATH变量要不要包含sbin的系统命令目录
依据账号设置好mailbox到/var/spool/mail/账号名
USER
根据用户的账号设置此变量内容
HOSTNAME
依据主机的hostname命令决定此变量内容
HISTSIZE
历史命令记录条数
调用外部设置数据
/etc/inputrc
包含bash热键、 Tab有没有声音等
/etc/profile.d/*.sh
规定bash操作接口颜色、语系、ll、ls、vi和which命令的命令别名
/etc/sysconfig/i18n
该文件由/etc/profile.d/lang.sh 调用,决定bash默认使用何种语系的配置文件,可设置变量LANG
~/.bash_profile 或者 ~/.bash_login 或者 ~/.profile
用户个人设置
依照该顺序只读取其中一个!
读入环境配置文件命令:
source
source ~/.bashrc
.
. ~/.bashrc
两个命令一样
non-login shell
不需要重复登陆取得的bash
e.g: X window登录linux 后启动的终端机/bash 环境下再次执行bash命令取得的子进程bash
读取的配置文件:
~/.bashrc ,唯一会读取的文件

/etc/bashrc
功能
1.依据不同UID规定umask的值
2.依据不同UID规定提示符(PS1变量)
3.调用/etc/profile.d/*.sh 的设置
其他相关配置文件
/etc/man.config
该文件内容规定了使用man 的时候 man page 的路径到哪里找
MANPATH 变量
什么时候要修改?
tarball方式安装软件后,man page 可能会放置在/usr/local/软件名/man里面。需要手动将该路径添加到/etc/man.config中才能使用man命令查找到新软件说明文件
/etc/.bash_history
登录bash后,bash 读取该文件,将所有历史命令读入内存供查看使用
/etc/.bash_logout
该文件来记录了当用户注销bash后系统离开前需要帮用户完成的操作
终端机的环境设置
stty
stty [-a]
列出目前所有stty参数
eof End of file,代表结束输入
eof=^D (^表示Ctrl按键)
erase 向后删除字符
erase=^?
intr 送出一个interrupt(中断)信号给目前正在运行的程序
intr=^C
kill 删除在目前命令行上的所有文字
quit 送出一个quit信号给目前正在运行的进程
start 在某个进程停止后,重新启动它的输出
stop 停止目前屏幕的输出
stop=^S
susp 送出一个terminal stop信号给正在运行的进程
susp=^Z

bash默认组合键
Ctrl+C
终止目前的命令
Ctrl+D
输入结束(EOF)
Ctrl+M
就是Enter
Ctrl+S
暂停屏幕输出
Ctrl+Q
恢复屏幕输出
Ctrl+U
在提示符下将整行命令删除
Ctrl+Z
暂停目前的命令
通配符与特殊符号
通配符
*
代表0到无穷多个任意字符
?
代表一定有一个任意字符
[]
代表一定有在中括号里面的任意一个字符
e.g: [abcd]代表有一个字符,可能是a,b,c,d这四个任何一个
[-]
代表在编码顺序内的所有字符
e.g: [0-9]代表0到9之间的所有数字
[^]
代表除中括号里面的其他一个字符
e.g: [^abc]代表一定有一个字符,只要不是a,b,c就接受
特殊符号
#
批注符号,用于注释(script中)
\
转义符号,将特殊符号或通配符还原成一般符号
|
管道符,分隔两个管道命令
;
命令连续执行分隔符
~
用户主文件夹
$
使用变量前导符
&
作业控制,将命令变成背景下工作
!
逻辑运算非
/
目录符号,路径分隔符
>,>>
数据流重定向,输出导向,> 替换,>> 累加
<,<<
数据流重定向,输入导向,<后面接数据源,<<后面的符号代表结束输入
''
单引号,不具有变量置换功能
""
双引号,具有变量置换功能
``
被括起来的为先执行的命令,可用$()替代
()
在中间为子shell的起始与结束
{}
在中间为命令块的组合
数据流重定向
标准输入(stdin):
代码为0,<或<<

标准输出(stdout)
代码为1,>或>>
1>
以覆盖的方式将正确的数据(standard output/stdout)输出到指定的文件或设备上,文件不存在则创建,若文件存在则先清空再写入数据
> rightfile
1>>
以累加的方法将正确的数据(stdout)输出到指定的文件或设备上,文件不存在则创建,若文件存在则在文件的最下方累加进去
>> rightfile
标准错误输出(stderr)
代码为2,2>或2>>
2>
以覆盖的方法将错误的数据(standard error output/stderr)输出到指定的文件或设备上
2> errorfile
2>>
以累加的方法将错误的数据(stderr)输出到指定的文件或设备上
2>> errorfile
黑洞设备:/dev/null
2> /dev/null 将错误输出忽略掉,不显示也不存储
正确与错误数据写入同一个文件:
> file 2>&1
&> file
两种方式均可
e.g: find /home -name .bashrc > list 2>&1 或者 find /home -name .bashrc &> list
命令执行的判断依据
不考虑命令相关性的连续命令执行:cmd ; cmd
e.g: sync; sync; shutdown -h now
命令彼此之间具有相关性的执行:
cmd1 && cmd2
若cmd1执行完毕且正确执行($?=0)则执行cmd2
若cmd1执行完毕且为错误($?)≠0则不执行cmd2
cmd1 || cmd2
若cmd1执行完毕且正确执行($?=0)则不执行cmd2
若cmd1执行完毕且为错误($?≠0)则执行cmd2
管道命令
选取命令
行操作命令
cut
cut -d '分隔符' -f n
-d 后面接分隔字符,与-f一起使用; -f 依据-d的分隔符将一段信息切割成数段,用-f指定去除第几段;
cut -c 字符范围
-c 以字符为单位去除固定的字符区间

grep
grep [-acinv] [--color=auto] '查找字符串' file
-a 将binary文件以text文件的方式查找数据
-c 计算'查找字符串'的次数
-i 忽略大小写
-n 输出行号
-v 反向选择,选出不含'查找字符串'的
--color=auto 可以将找到的关键字部分加上颜色显示
排序命令
sort
sort [-fbMnrtuk] [file or stdin]
-f 忽略大小写
-b 忽略最前面空格符部分
-M 一月份名字排序
-n 使用纯数字进行排序(默认以文字类型排序)
-r 反向排序
-u uniq,相同的数据中,仅出现一行代表
-t 分隔符,默认使用Tab分隔
-k 通过-t分割后,以哪个区间来进行排序

uniq
uniq [-ic]
-i 忽略大小写
-c 进行计数

wc
wc [-lwm]
-l 仅列出行
-w 仅列出多少字
-m或者-c 多少字符

双向重定向
tee
tee [-a] file
-a 以累加的方式将数据加入file中,不加参数a则直接覆盖
tee会同时将数据流送与屏幕和文件,它可以让standard output 转存一份到文件内并将同样的数据继续送到屏幕去处理

字符转换命令
tr
用来删除一段信息中的文字,或者进行文字信息的替换
tr [-ds] SET1 ...
-d 删除信息中的SET1这个字符串
-s 替换掉重复的字符

col
col [-xb]
-x 将Tab键转成对等的空格键
-b 在文字内由反斜杠(/)时,仅保留反斜杠最后接的那个字符
col经常用于将man page转存成纯文本文件以方便查阅
e.g: man cmd | col -b > cmd.man

join
将两个文件中有相同数据的行加在一起
join [-ti12] file1 file2
-t join默认以空格符分隔数据,并且对比第一个字段的数据,若两个文件的这个字段内 容相同则将两条数据连城一行,且第一个字段放在第一个
-i 忽略大小写
-1 数字1 代表第一个文件要用哪个字段来分析
-2 代表第二个文件要用哪个字段来分析

paste
相对于join需要对比两个文件的数据相关性,paste直接将两行贴在一起,中间以Tab键隔开
paste [-d] file1 file2
-d 后面可以接分隔字符,默认以Tab分隔
若file部分写成-表示来自stdin的数据

expand
将Tab按键转成空格键
expand [-t] file
-t 后面可以接数字,一般而言,一个Tab按键可以用8个空格键替换,也可以自己定义一个Tab按键代表多少个字符

文件切割命令
split
将一个大文件依据文件大小或行数来切割成小文件
split [-bl] file prefix
-b 后面可接欲切割成的文件大小,可加单位(b,k,m等)
-l 以行数来切割
prefix 代表前导符,可作为切割文件的前导文字

参数代换
xargs
产生某个命令的参数。xargs可以读入stdin数据,以空格符或断行符进行分辨,将stdin数据分隔成arguments
xargs [-0epn] command
-0 若输入的stdin含有特殊字符(空格,`,\等)通过-0参数可以将它还原成一般字符
-e EOF(end of file)后面可以接一个字符串,当xargs分析到该字符串就会停止继续工作
-p 在执行每个命令参数时,都会询问用户
-n 后面接次数,每次command命令执行时需要使用几个参数的意思
当xargs后面没有接任何命令时,默认以echo来进行输出

许多命令并不支持管道命令,可以通过xargs来提供这样的命令能够引用stdin之用

减号 - 的用途
在管道命令中经常会使用前一个命令的stdout作为本次命令的stdin,某些命令需要使用到文件名(e.g: tar)来进行处理,那么stdin和stdout就可以用减号 - 来替代

命令解释:将/home里面的文件打包,但打包的数据不是记录到文件,而是传动到stdout,经过管道后将tar -cvf - /home传送给后面的tar -xvf - ,后面的-就是取用前一个命令的stdout从而不再需要使用文件
chapter 12 正则表达式与文件格式化处理
正则表达式
definition: 以行为单位来进行字符串处理的方法,通过特殊符号的辅助可以轻易达到查找、删除、替换某特定字符串
基础正则表达式
环境语系会影响正则表达式的输出结果
LANG=C 语系下的特殊符号
[:alnum:]
代表英文大小写字符和数字,即 0-9,a-z,A-Z
[:alpha:]
代表英文大小写字符,即 A-Z,a-z
[:digit:]
代表数字,即 0-9
[:upper:]
代表大写字符,即 A-Z
[:lower:]
代表小写字符,即 a-z
[:blank:]
代表空格键与Tab按键
[:graph:]
除空格符(空格键与Tab按键)外的其他所有按键
[:cntrl:]
代表键盘上面的控制按键,即包括CR,LF,Tab,Del等
[:print:]
代表任何可以别被打印出来的字符
[:punct:]
代表标点符号(punctuation symbol),即 " ' ? ; : # $
[:space:]
代表会产生空白的字符,包括空格键、Tab、CR等
[:xdigit:]
代表十六进制的数字类型,包括 0-9,A-F,a-f的数字与字符
grep 高级用法
grep [-A] [-B] [--color=auto] '搜寻字符串' filename
-A 后面可加数字,after之意,除了列出该行外,后面的n行也列出来
-B 后面可加数字,befer之意,除了列出该行外,前面的n行也列出来
--color=auto 可将正确的那个选取数据列出颜色

基础正则表达式字符
^word
待查找字符串(word)在行首
e.g: grep -n '^#' filename 查找行首为#开始的行,并列出行号
行首为小写字符
grep -n ^[a-z]’亦可用:grep -n '^[[:lower:]]'
行首不为英文字符
grep -n '^[^a-zA-Z]' 亦可用 grep -n '^[^[:alpha:]]'
word$
待查找字符串在行尾
e.g: grep -n '!$' filename 查找出行尾为!的行,并列出行号
.
代表一定有一个任意字符
e.g: grep -n 'e.e' filename 查找出eve,eae,eee等即e与e之间一定仅有一个字符
\
转义字符将特殊符号的特殊意义去掉
e.g: grep -n '\'' filename 查找含有单引号的行
*
代表重复0到无穷过多个前一个字符(在*之前必须要紧跟一个RE字符比如任意字符表示为'.*')
e.g: grep -n 'ess*' filnename 查找含有es,ess,esss等的行
[list]
“或”查找,[]当中代表一个待查找的字符,可能的情况为或关系
e.g: grep -n 'g[ld]' filename 查找含有gl或gd的行
[n1-n2]
连续字符查找,-代表两个字符之间所有连续的字符
e.g: grep -n '[0-9]' filename 查找含有任意数字的行,也可以用 grep -n '[[:digit:]]' filename
e.g: grep -n '[A-Z]' filename 查找大写英文字符行,也可用 grep -n '[[:upper:]]' filename
e.g: grep -n '[a-z]' filename 查找小写英文字符行,也可用 grep -n '[[:lower:]]' filename
[^list]
反向查找,list代表反向选择,不需要的情况
e.g: grep -n 'oo[^f]' filename 查找字符可以是oog,ood,oot但不能是oof
\{n,m\}
连续n到m个的前一个RE字符,若为\{n\}则为连续n个前一个RE字符,若为\{n,\}则为连续n个以上前一个RE字符
e.g: grep -n 'go\{2,3\}d' filename 查找在g与d之间有2到3个o存在的行
sed
管道命令,可分析stdin,可将数据进行替换、删除、新增、选取特定行的功能
sed [-nefr] [动作]
-n 使用安静模式,在一般的sed用法中,所有来自stdin的数据一般都会被显示到屏幕上,如果加了参数n则只有经过sed特殊处理的那一行(或者操作) 才会被列出来
-e 直接在命令行模式上进行sed的动作编辑
-f 直接将sed的动作写在一个文件内,-f filename则可以执行filename内的sed动作
-r sed的动作支持的是扩展型正则表达式语法(默认是基础正则表达式语法)
-i 直接修改读取的文件内容,而不是由屏幕输出
动作说明: [n1[,n2]] function n1,n2不一定会存在,一般代表选择进行动作的行数,比如如果动作是需要在10到20行之间进行则为10,20[动作行为]
function参数
a:新增,后面可接字符串,而这些字符串会在新的一行(当前行的下一行)出现
c:替换,后面可接字符串,这些字符串可替换n1,n2行之间的行
d:删除
i:插入,后面可接字符串,这些字符串会出现在新的一行(当前行的上一行)
p:打印,将某个选择的数据打印出来,通常p会与参数sed -n 一起运行
s:替换,可以直接进行替换工作,通常搭配正则表达式e.g: 1,20s/old/new/g
usage
以行为单位的新增/删除功能
列出/etc/passwd内容并打印行号,删除2到5行/删除第2行/删除第3到最后一行
列出/etc/passwd内容并打印行号,在第2行后增加新内容/第2行前添加/增加多行

sed后面接的动作务必以单引号括起来
$ 代表最后一行
新增多行时,每一行之间必须以反斜杠\来进行新行的增加
以行为单位的替换/显示功能
将2到5行的内容替换为" No 2-5 number"
列出5-7行

部分数据的查找与替换功能
用行为单位进行部分数据的查找并替换,基本上与vi类似: sed 's/要被替换的字符串/新字符串/g'

sed 删除空白行:sed '/^$/d'
直接修改文件内容

扩展正则表达式
grep 默认仅支持基础正则表达式,若要使用扩展型正则使用egrep
特殊符号
+
重复一个或一个以上前一个RE字符
?
零个或一个前一个RE字符
|
用“或”的方式找出数个字符串
()
找出“组”字符串
()+
多个重复组的判别

文件的格式化与相关处理
格式化打印: printf
printf '打印格式' 实际内容
格式参数
\a 警告声音输出
\b 退格键
\f 清除屏幕
\n 输出新的一行
\r Enter键
\t 水平的tab按键
\v 垂直的tab按键
\xNN NN为两位数数字,可以转换数字成为字符
C程序语言内常见的变量格式
%ns n是数字,s代表字符string,即多少个字符
%ni n是数字,i代表integer,即多少个整数
%N.nf N与n都是数字,f代表floating(浮点)如果有小数,假设总位数为10,小数点有2位,即%10.2f
awk
数据处理工具 相较于sed作用于一整行处理,awk倾向于将一行分成数个“字段”处理
awk '条件类型1 {动作1} 条件类型2 {动作2} ...' filename
默认字段分隔符为空格键或tab键
变量
$0
代表一整行数据
$1
代表第一字段
$2
代表第二字段
$n
代表第n个字段
NF
代表每一行($0)拥有的字段总数
NR
代表目前awk所处理的是第几行数据
FS
代表目前的分隔符,默认是空格键
处理流程
1.读入第一行,并将第一行的数据填入$0,$1,$2等变量中
2.依据条件类型限制,判断是否需要进行后面的动作
3.做完所有的动作与条件类型
4.若还有后续的“行”数据,重复前面3个步骤直至数据全部读完为止

notice: awk后续的所有动作都需以单引号括住,格式内容如果要以print打印,对于非变量的文字部分,包含printf中的格式(\t\n等)都需要用双引号定义出来
awk的逻辑运算符
>
大于
<
小于
>=
大于等于
<=
小于等于
==
等于
!=
不等于

1.利用BEGIN关键字预先设置awk变量
2.所有awk的动作,即在{}内的动作,若需要有多个命令辅助,可利用分号(;)间隔
3.逻辑运算当中,“等于”的情况务必使用“==”
4.格式化输出时,在printf的格式设置中,务必加上“\n”,才能进行分行
5.与bash、shell的变量不同,awk当中变量可以直接使用不用加上$符号
文件比较工具
diff
以行为单位比较两个文件之间的区别,通常用在ASCII纯文本文件的比较上
diff [-bBi] from-file to-file
-b 忽略一行当中仅有多个空白的区别,“about me”与“about me”视为相同
-B 忽略空白行的区别
-i 忽略大小写
from-file 一个文件名,作为欲比较文件的文件名
to-file 一个文件名,作为目的比较文件的文件名
两个可以以 - 代替,代表stdin

notice: sed后面如果要接超过两个以上的动作时,每个动作前面需要加上 -e 才行!
cmp
以字节为单位比较两个文件,可以比较二进制文件
cmp [-s] file1 file2
-s 将所有的不同点的字节处都列出来,cmp默认仅会输出第一个发现的不同点

patch
补丁文件制作并升级
制作补丁文件
patch -Naur file.old file.new >file.patch
file.patch 就是补丁文件 patch_file
升级与还原
patch -pN < patch_file
更新
patch -R -pN < patch_file
还原
-p 后面的N表示取消几层目录的意思
-R 代表还原,将新的文件还原成原来旧的版本

chapter 13 shell script
#!/bin/bash
shell script 的第一行声明,声明这个script使用的shell名称
shell script 的执行 e.g: 脚本/home/vincent/shell.sh的执行
直接命令执行
绝对路径
使用 /home/vincent/shell.sh 执行
相对路径
若工作目录在/home/vincent/,则使用 ./shell.sh 执行
chmod a+x shell.sh;./shell.sh 执行
变量PATH功能
将shell.sh放到PATH指定的目录内(~/bin)
以bash进程来执行
通过 bash shell.sh 或 sh shell.sh 来执行
source 执行脚本
source shell.sh
1.使用直接命令或者 bash进程来执行脚本时,script 都会使用一个新的 bash 环境执行脚本内的命令,即 script 其实是在子进程的bash中执行,当子进程完成后,子进程内各项变量或操作将会结束而不会传回到父进程当中 2.使用 source 执行脚本会在父进程中执行,各项操作都会在原本的 bash 内生效
良好的shell script 编写习惯
script文件头信息
script 功能描述
script 版本信息
script 作者与联系方式
script 版权声明方式
script 的 History(历史记录)
script 内较特殊的命令,使用绝对路径的方式来执行
script 执行时需要的环境变量预先声明与设置

shell script 中数值运算
$((计算式))
e.g: var=$(($num1*$num2))

test 命令测试功能
关于某个文件名的“文件类型”的判断
test [-efdbcSpL] filename
-e 该文件名是否存在
-f 该文件名是否存在且为文件(file)
-d 该文件名是否存在且为此目录(directory)
-b 该文件名是否存在且为一个 block device 设备
-c 该文件名是否存在且为一个 character device 设备
-S 该文件名后是否存在且为一个 Socket 文件
-p 该文件名是否存在且为一个 FIFO(pipe)文件
-L 该文件名是否存在且为一个连接文件
关于文件的权限检测
test [-rwxugks] filename
-r 检测该文件名是否存在且具有“可读”权限
-w 检测该文件名是否存在且具有“可写”权限
-x 检测该文件名是否存在且具有“可执行”权限
-u 检测该文件名是否存在且具有“SUID”属性
-g 检测该文件名是否存在且具有“SGID”属性
-k 检测该文件名是否存在且具有“Sticky bit”属性
-s 检测该文件名是否存在且为“非空白文件”
两个文件之间的比较
test file1 [-nt/ot/ef] file2
-nt (newer than)判断file1是否比file2新
-ot (older than)判断file1是否比file2旧
-ef 判断file1与file2是否为同一文件,可用在 hard link的判定上,主要判断两个文件是否均指向同一个inode
关于两个整数之间的判定
test n1 [-eq/ne/gt/lt/ge/le] n2
-eq 两数值相等(equal)
-ne 两数值不等(not equal)
-gt n1 大于 n2 (greater than)
-lt n1 小于 n2(less than)
-ge n1 大于等于 n2(greater than or equal)
-le n1 小于等于 n2(less than or equal)
判定字符串的数据
test -z string
判定字字符串是否为0,若string为空字符串,则为true
test -n string
判定字符串是否不为0,若string为空字符串,则为false(-n 可省略)
test str1 = str2
判定str1 是否等于str2,若相等,则回传true
test str1 !=str2
判定str1是否不等于str2,若相等,则回传false
多重条件判定
test [判断条件1] [-ao!] [判断条件2]
-a (与/and)两个条件同时成立,则回传true
e.g:test -r file -a -x file 只有file同时具有r与x权限时才回传true
-o (或/or)任何一个条件成立就回传true
e.g: test -r file -o -x file file具有r或x权限时就可回传true
!(非)反向状态
e.g:test !-x file 当file不具有x时回传true

判断符号 []
notice:
1.在中括号内的每个组件都需要用空格键来分隔,如果要在bash语法当中使用中括号作为shell的判断式,中括号两端必须有空格符分隔
2.在中括号里的变量最好都以双引号括起来
3.在中括号里的常量最好都以单引号或床引号括起来

shell script 的变量
默认变量
$0
代表执行脚本文件名
$1
代表执行脚本第一个参数
$2
代表执行脚本第二个参数
$n
代表执行脚本第n个参数
特殊变量
$#
代表后接的参数"个数"
$@
代表 "$1"、"$2"、"$3"、"$4"之意,每个变量是独立的
$*
代表 "$1c$2c$3c$4",其中c代表分隔符,默认为空格,故"$*" 代表 "$1 $2 $3 $4"

参数变量号码偏移 :shift
可以移动变量,后面接数字,代表拿掉最前面几个参数的意思

条件判断式
if ... then
单层、简单条件判断式
if [ 条件判断式 ];then 当条件判断式成立执行的命令 fi
多个条件判断式
将多个条件写入一个括号内
一个条件一个中括号,使用多个中括号,括号与括号之间以 && 或 || 隔开
&&表示AND
||表示or

多重、复杂条件判断式
一个条件判断
if [ 条件判断式 ];then 当条件判断式成立时执行的命令 else 当条件判断式不成立时执行的命令 fi
多个条件判断
if [ 条件判断式一 ];then 当条件判断式一成立时执行的命令 elif [ 条件判断式二 ];then 当条件判断式二成立时执行的命令 else 当条件判断式一和二都不成立时执行的命令 fi

examples:
netstat:查询目前主机打开的网络服务端口
netstat -tuln
查看目前主机启动的服务
80:www
21:ssh
22:ftp
25:mail
111:RPC(远程过程调用)
631:CUPS(打印服务功能)
查看21,22,25,80主要网络服务状态

Happy birthday

case ... esca
case $变量名称 in "第一个变量内容") 程序段 ;; "第二个变量内容") 程序段 ;; *) 不包含第一和第二变量内容的其他程序段 exit 1 ;; esac
每个变量内容建议使用双引号括起来
每个类型结尾使用两个连续的分号
最后一个变量内容使用 * 代表所有其他值
function 功能
function fname(){ 程序段 }
shell script 中 function 的定义一定要在程序最前面
function 内置变量
$0
函数名称
$1
变量1(形参1)
$2
变量2(形参2)
...
循环
不定循环
while do done
while [ condition ] do 程序段 done
当 condition 条件成立时,进行循环知道 condition 条件不成立终止循环
until do done
until [ condition ] do 程序段 done
与 while 相反,当 condition 条件成立时终止循环否则继续循环
固定循环
for ... do ... done
for var in con1 con2 con3 ... do 程序段 done
$var 的循环取值
第一次循环:$var==con1
第二次循环:$var==con2
第三次循环:$var==con3
...
连续数字控制循环
$(seq n m)
代表从 n 到 m 之间一直连续的数字
以初始值,设置步长和限定条件的 for ... do ... done
for ( ( 初始值; 限制值; 执行步长 ) ) do 程序段 done
shell script 的追踪与调试
sh [-nvx] scripts.sh
-n 不执行 script ,仅查询语法问题,若语法没问题,不会显示任何信息!
-v 在执行 script 前先将 script 的内容输出到屏幕
-x 将使用到的 script 内容显示到屏幕

浮动主题