第四天:
<:标准输入
例:bc < f1.txt
将f1文件中的内容输入到bc中
*标准输入和标准输出不可以在同一文件中。
单行重定向:
例:cat >f2.txt
多行重定向:
例:cat <<!
叹号是开始结束符建议用EOF,必须成对,如果EOF前面必须加空格对齐前面加-
例:cat <<EOF >a.txt
将输入的多行命令输入到文件中
mail:发邮件:查看邮件
-s:发邮件:mail -s 【标题】 【用户名】
tr 转换和删除字符
tr [OPTION]... SET1 [SET2]
选项:
-c –C --complement:取字符集的补集
-d --delete:删除所有属于第一字符集的字符
-s --squeeze-repeats:把连续重复的字符以单独一个字符表示
-t --truncate-set1:将第一个字符集对应字符转化为第二字符集对应的字符
[:alnum:]:字母和数字 [:alpha:]:字母 [:cntrl:]:控制(非打印)字符
[:digit:]:数字 [:graph:]:图形字符 [:lower:]:小写字母 [:print:]:可打印字符
[:punct:]:标点符号 [:space:]:空白字符 [:upper:]:大写字母
[:xdigit:]:十六进制字符
tr -d `\r` < win.txt > win2.txt
修改文本格式
|:管道符
例如:who | tr `[:lower:]` `[:upper:]`
将who的输出输入到tr中并转换
管道符左边必须是标准输出,要不就在管道左边加&。老版本就在管道符右边加2>&1
less :一页一页地查看输入
ls -l /etc | less
mail: 通过电子邮件发送输入
echo "test email" | mail -s "test" user@example.com
lpr:把输入发送给打印机
echo "test print" | lpr -P printer_name
示例:
将 /home 里面的文件打包,但打包的数据不是记录到文件,而是传送到 stdout,经过管道后,将 tar -cvf - /home 传送给后面的 tar -xvf - , 后面的这个 - 则是取前一个命令的 stdout, 因此,就不需要使用临时file了
tar -cvf - /home | tar -xvf -
命令1 | tee [-a ] 文件名 | 命令2
把命令1的STDOUT保存在文件中,做为命令2的输入
-a 追加
使用:
保存不同阶段的输出
复杂管道的故障排除
同时查看和记录输出
用户、组和权限管理:
安全3A:
Authentication:认证
Authorization:授权
Accouting|Audition:审计
getent passwwd:查看所有用户信息
Linux用户和组的主要配置文件:
/etc/passwd:用户及其属性信息(名称、UID、主组ID等)
/etc/group:组及其属性信息
/etc/shadow:用户密码及其相关属性
/etc/gshadow:组密码及其相关属性
etc/skel:创建新用户默认的配置文件
chpasswd :批量修改用户口令
su:临时切换用户
-:永久切换
-c:后边跟要查看的命令
文件权限
文件:
r 可使用文件查看类工具获取其内容
w 可修改其内容
x 可以把此文件提请内核启动为一个进程
目录:
r 可以使用ls查看此目录中文件列表
w 可在此目录中创建文件,也可删除此目录中的文件
x 可以使用ls -l查看此目录中文件元数据(须配合r),可以cd进入此目录
X 只给目录x权限,不给文件x权限
7rwx 6rw- 5r-x 4r--
r=4 w=2 x=1
第五天:
修改文件的默认权限:
umask+default=dir(文件夹)777/file(文件)666
umask值+文件权限值=dir(文件夹)777/file(文件)666
放到用户家目录中/.bashrc
umask 0 :表示不检查 1 将对应有权限位去除
文件默认权限:666-umask,如果结果有奇数,就+1,偶数不变
目录默认权限:777-umask。
(umask 066;touch f10)临时建不一样权限使用
Suid:特权只能作用在二进制文件上
sgid:特权只能作用在二进制的可执行文件中
在此目录中的新文件的所属组,自动继承目录的所属组
Sticky:特权只能用于文件夹上
chattr +i 不能删除,改名,更改
chattr +a 只能追加内容
lsattr 显示特定属性
ACL:Access Control List,实现灵活的权限管理
加了ACL之后所属组权限显示至不在显示所属组权限
getfacl 可看到特殊权限:flags
setfacl -m u:wang:rwx file|directory加权限
setfacl -Rm g:sales:rwX directory
setfacl -M file.acl file|directory
setfacl -m g:salesgroup:rw file| directory
setfacl -m d:u:wang:rx directory默认文件夹中新建的文件继承目录的ACL权限
setfacl -x u:wang file |directory删权限
setfacl -X file.acl directory
setfacl -k dir 删除默认ACL权限
setfacl –b file1清除所有ACL权限
getfacl file1 | setfacl --set-file=- file2 复制file1的acl权限给file2
权限执行顺序:先看是不不是所属人,不是的话就看ACL
在ACL内部先看用户后看组最后看其余人
如果一个人属于多个组,而且多个组都在ACL权限中,则该用户继承所有组的累加权限。
文本处理工具和证则表达式:
cat:看文件,不要看二进制文本
-E:显示行结束符$
-n:可以表明行号
-A:显示所有控制符
-b:非空行编号
-s:压缩连续的空行成一行
tac:每行倒序显示文本文件
rev:同一行倒叙显示
more:分页查看文件
-d: 显示翻页及退出提示
less:一页一页地查看文件或STDIN输出
head [OPTION]... [FILE]...:查看文本的指定几行
-c # 指定获取前#字节
-n # 指定获取前#行
-# 指定行数
tail [OPTION]... [FILE]...:显示文件内容
-c # 指定获取后#字节
-n # 指定获取后#行
-# 同上
-f 跟踪显示文件fd新追加的内容,常用日志监控
相当于 --follow=descriptor
-F 跟踪文件名,相当于--follow=name --retry
tailf 类似tail –f,当文件不增长时并不访问文件
cat /dev/urandom |tr -dc '[:a:]' | head -c8:随机取字节
cut:筛选
-d DELIMITER: 指明分隔符,默认tab
-f FILEDS:
#: 第#个字段
#,#[,#]:离散的多个字段,例如1,3,6
#-#:连续的多个字段, 例如1-6
混合使用:1-3,7
-c 按字符切割
--output-delimiter=STRING指定输出分隔符
例如:取ifconfig中的ens33的IP地址
ifconfig ens33 |head -2 |tail -1 |tr -s " " : |cut -d: -f3
paste 合并两个文件同行号的列到一行
paste [OPTION]... [FILE]...
-d 分隔符:指定分隔符,默认用TAB
-s : 所有行合成一行显示
wc:收集文本统计数据
-l 只计数行数
-w 只计数单词总数
-c 只计数字节总数
-m 只计数字符总数
-L 显示文件中最长行的长度
sort:把整理过的文本显示在STDOUT,不改变原始文件
-r 执行反方向(由上至下)整理
-R 随机排序
-n 执行按数字大小整理
-f 选项忽略(fold)字符串中的字符大小写
-u 选项(独特,unique)删除输出中的重复行
-t c 选项使用c做为字段界定符
-k X 选项按照使用c字符分隔的X列来整理能够使用多次
uniq命令:从输入中删除前后相接的重复的行
-c: 显示每行重复出现的次数
-d: 仅显示重复过的行
-u: 仅显示不曾重复的行
注:连续且完全相同方为重复
diff:命令的输出被保存在一种叫做“补丁”的文件中(不可以看二进制文本)
-u 选项来输出“统一的(unified)”diff格式文件,最适用于补丁文件
patch:复制在其它文件中进行的改变(要谨慎使用)
-b 选项来自动备份改变了的文件
cmp:和diff效果一样,但可以看二进制文件
grep:文本过滤(模式:pattern)工具;文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行
grep, egrep, fgrep(不支持正则表达式搜索)
grep [OPTIONS] PATTERN [FILE...]
--color=auto: 对匹配到的文本着色显示
-v: 显示不被pattern匹配到的行
-i: 忽略字符大小写
-n:显示匹配的行号
-c: 统计匹配的行数
-o: 仅显示匹配到的字符串
-q: 静默模式,不输出任何信息
-A #: after, 后#行
-B #: before, 前#行
-C #:context, 前后各#行
-e:实现多个选项间的逻辑or关系
grep –e ‘cat ’ -e ‘dog’ file
-w:匹配整个单词
-E:使用ERE
-F:相当于fgrep,不支持正则表达式
-f file: 根据模式文件处理
sed:stream editor,文本编辑工具
awk:Linux上的实现gawk,文本报告生成器
*正则表达式:
基本正则表达式:BRE
扩展正则表达式:ERE
例如:grep -E
元字符分类:字符匹配、匹配次数、位置锚定、分组
字符匹配:
. 匹配任意单个字符
[] 匹配指定范围内的任意单个字符,示例:[wang] [0-9] [a-z] [a-zA-Z]
[^] 匹配指定范围外的任意单个字符
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母 [:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字 [:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数
* 匹配前面的字符任意次,包括0次
贪婪模式:尽可能长的匹配
.* 任意长度的任意字符
\? 匹配其前面的字符0或1次
\+ 匹配其前面的字符至少1次
\{n\} 匹配前面的字符n次
\{m,n\} 匹配前面的字符至少m次,至多n次
\{,n\} 匹配前面的字符至多n次
\{n,\} 匹配前面的字符至少n次
位置锚定:定位出现的位置
^ 行首锚定,用于模式的最左侧
$ 行尾锚定,用于模式的最右侧
^PATTERN$ 用于模式匹配整行
^$ 空行
^[[:space:]]*$ 空白行
\< 或 \b 词首锚定,用于单词模式的左侧
\> 或 \b 词尾锚定,用于单词模式的右侧
\<PATTERN\> 匹配整个单词
分组:\(\) 将一个或多个字符捆绑在一起,当作一个整体处理,如:\(root\)\+
分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, ...
\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
示例: \(string1\+\(string2\)*\)
\1 :string1\+\(string2\)*
\2 :string2
后向引用:引用前面的分组括号中的模式所匹配字符,而非模式本身
或者:\|
示例:a\|b: a或b C\|cat: C或cat \(C\|c\)at:Cat或cat
egrep = grep -E:扩展的正则表达式
字符匹配:
. 任意单个字符
[] 指定范围的字符
[^] 不在指定范围的字符
次数匹配:
* 匹配前面字符任意次
? 0或1次
+ 1次或多次
{m} 匹配m次
{m,n} 至少m,至多n次
位置锚定:
^ 行首
$ 行尾
\<, \b 语首
\>, \b 语尾
分组:
()
后向引用:\1, \2, ...
或者:
a|b a或b
C|cat C或cat
(C|c)at Cat或cat
第六天:
egrep = grep -E:扩展的正则表达式
字符匹配:
. 任意单个字符
[] 指定范围的字符
[^] 不在指定范围的字符
次数匹配:
* 匹配前面字符任意次
? 0或1次
+ 1次或多次
{m} 匹配m次
{m,n} 至少m,至多n次
位置锚定:
^ 行首
$ 行尾
\<, \b 语首
\>, \b 语尾
分组:
()
后向引用:\1, \2, ...
或者:
a|b a或b
C|cat C或cat
(C|c)at Cat或cat
vim:文本编辑器
文本编辑种类:
行编辑器: sed
全屏编辑器:nano, vi
vim - Vi Improved
其他编辑器:
gedit 一个简单的图形编辑器
gvim 一个Vim编辑器的图形版本
+# 打开文件后,让光标处于第#行的行首,+默认行尾
+/PATTERN 让光标处于第一个被PATTERN匹配到的行的行首
–b file 二进制方式打开文件
–d file1 file2… 比较多个文件
-m file 只读打开文件
vim -e file 或 ex file 直接进入ex模式
命令模式=>i=>插入模式(a(行首),A(行尾),O(下一行),o(上一行))
i insert, 在光标所在处输入
I 在当前光标所在行的行首输入
a append, 在光标所在处后面输入
A 在当前光标所在行的行尾输入
o 在当前光标所在行的下方打开一个新行
O 在当前光标所在行的上方打开一个新行
插入模式 --------> 命令模式
ESC
命令模式 --------> 扩展命令模式
:
扩展命令模式 --------> 命令模式
ESC,enter
扩展命令模式:
:q 退出
:q! 强制退出,丢弃做出的修改
:wq 保存退出
:x 保存退出
命令模式:
ZZ 保存退出
ZQ 不保存退出
常见命令
w 写(存)磁盘文件
wq 写入并退出
x 写入并退出
q 退出
q! 不存盘退出,即使更改都将丢失
r filename 读文件内容到当前文件中
w filename 将当前文件内容写入另一个文件
!command 执行命令
r!command 读入命令的输出
字符间跳转:
h: 左 l: 右 j: 下 k: 上
#COMMAND:跳转由#指定的个数的字符
单词间跳转:
w:下一个单词的词首
e:当前或下一单词的词尾
b:当前或前一个单词的词首
#COMMAND:由#指定一次跳转的单词数
当前页跳转:
H:页首 M:页中间行 L:页底
zt:将光标所在当前行移到屏幕顶端
zz:将光标所在当前行移到屏幕中间
zb:将光标所在当前行移到屏幕底端
行首行尾跳转:
^ 跳转至行首的第一个非空白字符
0 跳转至行首
$ 跳转至行尾
行间移动:
#G 或者扩展命令模式下:# 跳转至由第#行
G 最后一行
1G, gg 第一行
句间移动:
) 下一句 ( 上一句
段落间移动:
} 下一段 { 上一段
字符编辑:
x 删除光标处的字符
#x 删除光标处起始的#个字符
xp 交换光标所在处的字符及其后面字符的位置
~ 转换大小写
J 删除当前行后的换行符
替换命令(r, replace)
r 替换光标所在处的字符
R 切换成REPLACE模式
删除命令:
d 删除命令,可结合光标跳转字符,实现范围删除
d$ 删除到行尾
d^ 删除到非空行首
d0 删除到行首
dw 删除下一个整个单词
de
db
#COMMAND
dd:删除光标所在的行
#dd 多行删除
D:从当前光标位置一直删除到行尾,等同于d$
复制命令(y, yank):
y 复制,行为相似于d命令
y$
y0
y^
ye
yw
yb
#COMMAND
yy:复制行
#yy 复制多行
Y:复制整行
粘贴命令(p, paste):
p 缓冲区存的如果为整行,则粘贴当前光标所在行的下方;否则,则粘贴至当前光标所在处的后面
P 缓冲区存的如果为整行,则粘贴当前光标所在行的上方;否则,则粘贴至当前光标所在处的前面
改变命令(c, change)
c: 修改后切换成插入模式
cc:删除当前行并输入新内容,相当于S
#cc
C:删除当前光标到行尾,并切换成插入模式
常见Command
y 复制、d 删除、gU 变大写、gu 变小写
例如: 0y$ 命令
0 → 先到行头
y → 从这里开始拷贝
$ → 拷贝到本行最后一个字符
di" 光标在”“之间,则删除”“之间的内容
yi( 光标在()之间,则复制()之间的内容
vi[ 光标在[]之间,则选中[]之间的内容
dtx 删除字符直到遇见光标之后的第一个 x 字符
ytx 复制字符直到遇见光标之后的第一个 x 字符
可视化模式:
允许选择的文本块
v 面向字符
V 面向行
ctrl-v 面向块
可视化键可用于与移动键结合使用
w ) } 箭头等
突出显示的文字可被删除,复制,变更,过滤,搜索,替换等
多文件模式:
vim FILE1 FILE2 FILE3 ...
:next 下一个
:prev 前一个
:first 第一个
:last 最后一个
:wall 保存所有
:qall 退出所有
:wqall
多文件分割
vim -o|-O FILE1 FILE2 ...
-o: 水平分割
-O: 垂直分割
在窗口间切换:Ctrl+w, Arrow
单文件窗口分割
Ctrl+w,s:split, 水平分割
Ctrl+w,v:vertical, 垂直分割
ctrl+w,q:取消相邻窗口
ctrl+w,o:取消全部窗口
:wqall 退出
扩展模式:当前vim进程有效
配置文件:永久有效
全局:/etc/vimrc
个人:~/.vimrc
(1) 行号
显示:set number,简写 set nu
取消显示:set nonumber, 简写 set nonu
(2) 忽略字符的大小写
启用:set ignorecase,简写 set ic
不忽略:set noic
(3) 自动缩进
启用:set autoindent,简写 set ai
禁用:set noai
(4) 复制保留格式
启用:set paste
禁用:set nopaste
(5) 智能缩进
启用:smartindent ,简写 set si
禁用:set nosi
(6) 高亮搜索
启用:set hlsearch
禁用:set nohlsearch
(7) 语法高亮
启用:syntax on
禁用:syntax off
(8) 文件格式
启用windows格式:set fileformat=dos
启用unix格式:set fileformat=unix
简写 set ff=dos|unix
(9) 设置文本宽度
set textwidth=65 (vim only)
set wrapmargin=15
(10) 设置光标所在行的标识线
启用:set cursorline,简写 set cul
禁用:set no cursorline
(11) 显示Tab和换行符 ^I 和$显示
启用:set list
禁用:set nolist
bash -n:检查语法错误
bash -x:显示执行过程
Shell中变量命名法则:
1、不能使程序中的保留字:例如if, for
2、只能使用数字、字母及下划线,且不能以数字开头
3、见名知义
4、统一命名规则:驼峰命名法
Shell中命名建议规则:
1、变量名大写
2、局部变量小写
3、函数名小写
4、用英文名字,并体现出实际作用
变量赋值:name=‘value’
可以使用引用value
(1) 可以是直接字串:name=“root"
(2) 变量引用:name="$USER"
(3) 命令引用:name=`COMMAND`
name=$(COMMAND)
unset:销毁变量
变量声明、赋值:
export name=VALUE
declare -x name=VALUE
显示所有环境变量:
env
printenv
export
declare -x
删除变量:
unset name
bash内建的环境变量
PATH
SHELL
USER
UID
HOME
PWD
SHLVL
LANG
HOSTNAME
HISTSIZE
_ 下划线
进程使用退出状态来报告成功或失败
0 代表成功,1-255代表失败
$? 变量保存最近的命令退出状态
bash中的算术运算:help let
+, -, *, /, %取模(取余), **(乘方),乘法符号有些场景中需要转义
实现算术运算:
(1) let var=算术表达式
(2) var=$[算术表达式]
(3) var=$((算术表达式))
(4) var=$(expr arg1 arg2 arg3 ...)
(5) declare –i var = 数值
(6) echo ‘算术表达式’ | bc
增强型赋值:
+=, -=, *=, /=, %=