注:本人为Mac用户,用书为《Unix&Linux大学教程》,用的shell是系统默认的bash。
Unix 工作环境
多任务处理系统
Unix 可以同时执行多个任务,但是,单个处理器同一时间只能运行单个进程(process)。所以,Unix允许单一进程在极短的时间(时间片 time slice, 通常为10ms)内使用处理器,而由调度器分配处理器的使用。
多个终端和GUI终端
- Unix允许用户启动多个终端(多个CLI终端+GUI终端)。
- 当需要从一个terminal移动数据到另一个terminal时,可使用鼠标中键或复制粘贴。
超级用户 su
Mac的su功能是disabled的,一般使用sudo
替代执行单条指令,sudo
区别于su
,使用时仅需输入当前用户的口令(但谁可以执行sudo
是由超级用户决定的,存储于/etc/sudoers中)。在输入正确的口令后,在一段时间内,使用sudo指令都不需要口令,一般缺省为5分钟。
su weedly 变换用户标识
su - weedly 以weedly名义工作
配置文件
Windows:采用注册表.ini,难以阅读,修改后容易出事情
Unix: 使用配置文件,每个程序都拥有自己的配置文件,文档化可读性好,鼓励用户阅读修改
init、reboot、shutdown
系统运行级别:
运行级别 | 描述 |
---|---|
0 | 关机 |
1 | 单用户模式:命令行 |
2 | 非标准化 |
3 | 多用户模式:命令行 |
4 | 非标准化 |
5 | 多用户模式:GUI |
6 | 重启 |
用命令行重启是一件很酷的事哟~
sudo init 6 # 重启
sudo reboot # 重启
sudo shutdown now #关机
sudo dmesg | less # 浏览启动信息(看不懂)
- 注意:调戏系统之前请先存档!
开启多任务模式
一些简单的快捷键 Mac:
Command+Tab Command+Shift+Tab 切换程序
Command+Shift+V 粘贴为纯文本
Command+←(^A)Command+→( ^E) 行首,行尾
Unix键盘使用
- Teletype,缩写tty,是最初的终端,和现在的键盘类似,Return和Line Feed 分为连个键。Unix系统上终端的名字也叫tty。(
stty
:set tty设置终端,gtty
:打开终端通信。)输出 = 在卷筒纸上打印print。pwd = print working directory。 - VT100是最流行的终端。
支持多种类型终端
unix系统支持多种类型终端,但每个终端都有自己的特征,并有自己的命令集。因此,unix有一个标准数据库,讲不同类型终端的描述收集到这个数据库中。
infocmp vt100 | less # 获得VT100终端信息
系统如何知道终端类型
过去: 用户告诉系统
现在:内置终端 - 本来就知道,虚拟终端 - 仿真程序,非终端。
现在一般只能看到4种类型的终端:
VT100(文本终端), xterm(标准图形终端), VT220, 3270
我的终端是:
echo $TERM # TERM为环境变量,存储用户使用终端的类型
xterm-256color
修饰键Ctrl
Ctrl+A = ^A
Shift 和 Ctrl 都是Unix开发时就有的键,但Alt是新加的。
键盘信号
stty # 显示terminal设定和被修改过的键盘映射
stty -a # 显示键盘信号映射
stty kill ^U # 修改kill的键盘映射
Mac 上:
discard = ^O; dsusp = ^Y; eof = ^D; eol = ;
eol2 = ; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;
min = 1; quit = ^; reprint = ^R; start = ^Q; status = ^T;
stop = ^S; susp = ^Z; time = 0; werase = ^W;
键入过程中的信号
名称 | 描述 | 键 |
---|---|---|
erase | 删除最后一个字符 | Backspace Delete |
werase | 删除最后一个单词 | ^W |
kill | 删除整行 | ^U (Ubuntu/Mac) / ^X |
停止程序的信号
名称 | 描述 | 键 |
---|---|---|
intr | 中断正在执行的程序(可被程序忽略)或取消键入中的命令(与kill效果相同) | ^C /Delete |
quit | 停止程序,过去还会生成core文件帮助调试(程序终止时内存中的内容) | ^\ |
stop | 临时停止屏幕显示(程序不会停止,输出会被存储,但不会在终端中显示) | ^S |
start | 继续屏幕显示 | ^Q |
eof | 文件结束信号,可停止shell | ^D |
命令行编辑
标准输入允许Unix以相同方式读取数据(不管数据来自于终端或磁盘)。标准输出允许以相同方式输出。
- Return 返回 = ^M, 换行字符Line Feed = ^J
- 每行文本要以^J 结尾
- 用户写文本时输入Return,Unix 自动将^M转化为 ^J
- 数据发送到终端时,^J自动转化为 ^M ^J
- Unix ^J 结尾,windows ^M ^J 结尾,mac ^M 结尾
# 当终端设置出错,return键无法正常使用时
<Ctrl+J>stty sane<Ctrl+J>
<Ctrl+J>reset<Ctrl+J>
能够立即使用的程序
程序 | 作用 | 示范 |
---|---|---|
which / type | 查询程序是否安装 | which pip date less |
date | 显示当前时间和日期 | date |
cal | 显示日历 | cal [-j] [月份] [年份] |
uptime | 系统连续运行的时长,负载 | (输出前1分钟,前10分钟,前15分钟的负载) |
hostname | 计算机名称 | |
uname | 操作系统的名称 | 我的输出: Darwin |
whoami | 查看用户标识 | |
quota | 查看自己的限制 | |
users | 当前登陆用户的标识 | |
who | 谁登陆了 | |
w | 更多信息 |
who信息
USER:用户标识
TTY:终端名称
FROM: 远程计算机的名称(- 表示本地)
LOGIN@:登陆时间
IDLE: 自从上次按键到当前的时间
JCPU: 自登陆后使用处理器的时间
PCPU:当前进程使用处理器的时间
WHAT:当前运行的命令
Unix手册与info
man cp # 在问问题前,请先RTFM(仔细研读Unix手册)
man ascii # 查看ascii码
# 1)空格在数字前 2)数字在大写字母前 3)小写在大写后
- 阅读说明书时,可以输入
!date<Return>
来查看日期233
程序 | 作用 |
---|---|
whatis | 查询命令作用 |
apropos | 查找含有关键词的命令 |
命令语法(Command Syntax)
date; cal # 一行输入两个命令
手册阅读事项
- 方框中可选。不在方框中为必选。
- 黑体字原样输入。
- 斜体字用适合值代替。
- … 表示可以重复任意多次。
- 如果一个单独选项和一个参数组合在一起,两者必须同时使用。 例:man [-P pager] [-S sectionlist] name…
- 用竖线分开的两个或多个项,表示可以从中任选一个(或不选)。例:who [-abdHilmpqrstTu] [file | arg1 arg2]
*注: 在终端中阅读手册时,可能无法显示特殊字体,一般会用下划线代替斜体。
shell
POSIX - Portable Operating System Interface, 是操作系统标准化的蓝图。
man sh #查看shell说明书
man csh
tcsh # 开始使用Tcsh,^D退出
less /etc/shells # 查看电脑上装的shell
echo $SHELL # 查看当前使用的shell
chsh [-s shell] [userid] # 改变默认shell
我的电脑上装了:
/bin/bash #Bash
/bin/csh #C-Shell
/bin/ksh #Korn Shell
/bin/sh #Bash??
/bin/tcsh #Tcsh
/bin/zsh #Zsh
两种类型的shell
- 交互式: 我们使用的terminal
- 非交互式: shell脚本
shell基础知识
- 变量
- 命名规则和C中类似
- 环境变量=全局变量(全大写,e.g.: MYVAR)
- 子进程改父进程的环境变量不会传递到父进程,但可以读
- shell变量=局部变量(全小写,e.g.: myvar)
- 特定shell中可用,或提供临时存储
- 创建变量时默认为shell变量
MYVAR=3
export MYVAR # 设为环境变量# 显示变量
env; printenv # 两个都是显示当前环境变量
env | sort | less # sort结果
set # 显示shell变量,只在shell中的就不是环境变量,但环境变量是shell变量
echo happy # 显示字符
echo $TERM or ${TERM} # 显示变量
echo "happy <${TERM}>" # <>有特殊含义,""防止解释# 设置变量
export home=cool # 赋值为字符串,同时设为环境变量
home="cool dog" # 赋值字符串中含有空格# 设置shell选项
set -o monitor
set +o monitor # 清楚shell选项
set -o
set +o # 查看当前option
-
进程
1)父进程,子进程 (shell中开启vi,shell是父进程,vi 是子进程) -
元字符: 某些字符拥有特殊的含义
- 忽略特殊含义
\|,\$
,保留单个字符,甚至可以转义<Return>
- 单引号引用1串字符,保留所有字符
echo 'happy\\\'
- 双引号保留 $ 和 ` 和 \ 的特殊含义
- 忽略特殊含义
-
内置命令和外部命令 可看type command 的输出结果判断
- 内置命令(built-in)
- 外部命令
# 查看内部命令
apropos builtin
help
- 搜索路径 $PATH : 在哪里找可执行文件
basename $SHELL # 提取路径名的最后部分
- 历史记录
fc -l; history # 显示历史记录
fc -s 24 # 重新执行历史记录的第24条
fc -s q=e # 执行上条命令,q换为e
# 用法 fc -s /pattern=replacement/ /number/
export HISTSIZE=50 # 设置历史列表的长度# 避免误删
ls temp* extra?
fc -s ls=rm
^R ->搜索历史记录
- Alias
alias # 显示所有alias
alias a='alias'
unalias a# 运行原程序
alias ls='ls -l'
\ls # 执行ls,没有-l# 重新执行上条命令,注意,上条命令可别是 fc -s
alias r="fc -s"# !ls:* 上一条ls命令的所有argument
-
Shell初始化文件
- 三个文件(bash):.bash_profile/.bash_login(登陆文件,登陆时),.bashrc(环境文件,shell启动时,rc=run command),.bash_logout(登出文件)
- 点文件(隐藏文件),可用
ls -a
查看
- 点文件(隐藏文件),可用
- 三个文件(bash):.bash_profile/.bash_login(登陆文件,登陆时),.bashrc(环境文件,shell启动时,rc=run command),.bash_logout(登出文件)
-
重定向
- 标准输入、标准输出、标准错误(错误信息)
- 重定向
- [标注输出]
>
覆盖原有输出文件,>>
追加,仅有标准输出被重定向,标准错误仍显示在terminal- 防止
>
覆盖:set -o noclobber
,忽略noclobber
:>|
- 防止
- [标准输入]
<
- [标准错误]
- [标注输出]
command 0< inputfile # 重定向标准输入
command 1> outputfile
command 2> errorfile
command 2>> errorfile # Append
# example
sort < rawdata > results 2> errors
sort < rawdata > results 2> &1 # 将标准输入和标准输出都重定向到results
sort < rawdata >& results # 同上
sort < rawdata >> results 2> &1 # 都 append# 抛弃输出
update > dev/null
- 子shell
- 内部命令 - 直接执行
- 外部命令 - 打开新进程,到新进程完成后,重新获得控制权
- 在当前shell中创建子shell,继承父shell的环境变量,但修改环境变量不会影响父shell
(date)
该命令在新建的子shell中运行,不会影响父进程
- 管道
- 将上一步的输出传到下一步
tee [-a] file... # 管道分流,-a append
cat names1 names2 | tea masterlist | grep harley
- 条件执行
command1 && command2 # command1 成功才执行command2
command1 || command2 # command1 失败才执行command2
Shell 过滤器
基本过滤器
- cat 文件连接
# cat -n(输出加行号)-b(和-n连用,不要给空白航加行号)-s(多个空白行用一个空白行替代)
cat >> data # 将标准输入append到data这个文件中
cat data # 将terminal中显示data的内容
# 等同于
cat < data
- split 文件划分
# split [-d(输出文件以数字命名)] [-a(后缀位数] [-l lines(每个文件的行数)] [file [prefix 输出文件的前缀]]
split -l 5000 data # 把data分成每个5000行的文件
-
tac[mac 上没有???等价于 tail -r [filename]]
和cat一样,但输出顺序反转 -
rev 各行字符反转
abc
def
变为
cba
fed -
head/ tail
head [-n lines] # 显示头十行
tail [-n lines]
- sort 排序
sort name address # 排序
- colrm 删除列
colrm [startcol [endcol]]
比较类过滤器
- cmp
输出两个文件第一个不同的byte,可以比较任意文件 - comm 比较有序文本(&较小)文件
分三列显示,第一列为第一个文件独有的,第二列为第二个文件独有的,第三列为两者共同的
-123(取消第n列第输出) - diff 比较无序文本(&较大)文件
diff
-i(case insensitive)
-w(忽略所有空白符)
-b(多个空白符当作一个)
-B(忽略空白行)
-q(quiet,忽略所有输出,仅当两个文件不同时输出)
-s(仅当两个文件相同时输出)
-c(context,适当显示不同部分的上下文)
-u(统一输出,没有重复输出,可读性好)
-y(并排显示,非常容易看出区别)
喜欢并排显示的人会用
sdiff (直接用等价于diff -y)
-l(相同部分只显示左边)
-s(减去所有相同输出)
-w columns(改变列宽度)
<<一些用于忽略的选项类似于diff>>
-W(忽略所有空白符)
应用
diff and patch
发布新版本时,只要发布和上一版本的diff,然后将diff补到前一版本即可 - cut 抽取数据列
与colrm相反
用法1: cut -c list [file,…]
例如: cut -c 14-30 info
用法2: cut -f list [-d delimiter] [-s] [file, …]
例如:cut -f 1 -d ‘:’ /etc/passwd
对于不同文件来说,定界符(delimiter)可能不同(常见文件.csv comma-separated value,以逗号为定界符) - paste 组合数据列
水平组合数据
用法:paste [-d char…] [file…]
如果指定了多个 delimiter,将会轮流使用。
统计和格式化过滤器
- nl 创建行号
用法: nl [-v start] [-i increment] [-b a] [-n ln|rn|rz] [file…]
start 起始数字
increment 增量
-b a 强制对空行编号
-n ln(编号左对齐) rn(右对齐) rz(右对齐,有前导0) - wc 统计行单词字符的数量
用法:wc [-clLw] [file…]
输出 行数 单词数 字符数
(多个文件还输出总和)
-c(字符) -l(行数)-w(字数)-L(最长行长度) - expand 将制表符转换为空格
用法:expand [-i] [-t size| -t list] [file…]
-i 只改变行开头的制表符
-t 制表符size (或制表位的位置,list)
4.unexpand 将空格转换为制表符
用法:unexpand [-a] [-t size| -t list] [file…]
-a: unexpand 默认只改变行开头的空格,使用-a改变所有空格
-t: 制表符size (或制表位的位置,list) - fold将长行折成短行
用法:fold [-s] [-w width] [file…]
-s 不分割单词
-w 每行宽度,默认行宽为80字符/行 - fmt格式化段落
用法:fmt [-su] [-w width] [file…]
-u uniform spacing 单词之间最多只有一个空格,句子末尾最多两个空格(* fmt不增加空格,只减少空格)
-w width
-s split only,不连接短行 - pr 格式为适合打印的文本
选取、排序、组合及变换
- grep 选取包含特定模式的行
用法:grep [-cilLnrsvwx] pattern [file…]
-c count, 显示包含该模式的行的数量
-i case insensitive
-n 显示包含模式的行在文本中的行号
-l 在多个文件中查找特定模式时,显示含有该模式的文件的文件名
-L 与-l相反,列举不包含该模式的文件的文件名
-w 指定只搜索完整的单词
-v reverse,显示不包含某模式的行
-x 搜索模式占用整行的行
-r 在指定目录中的所有文件中搜索
-s 抑制错误信息 - fgrep 和 egrep
fgrep fast版本的grep
egrep 扩展版本的grep - look 选取以特定模式开头的行
用法1:look [-df] pattern file…
不能从标准输入中读入,文件必须已经排序过!!!
-d dictionary 只考虑字母和数字
-f 忽略大小写的区别
用法2:look pattern
查找所有以pattern开头的单词 - sort 排序
用法:sort [-dfnru] [-o outfile] [infile…]
-o outfile 主要用于outfile和infile 相同(重定向不可用)
-d 只查看字母数字空白符
-f fold 忽略大小写区别
-n 字段开头数字从小到大排
-r 反向排序
-u unique,去除重复行
-c check检查数据是否有序 -cu 有序且唯一
*Ascii码序 空格数字大写小写
*locale 设置地区 - uniq 查找重复行
用法:uniq [-cdu] [infile [outfile]]
必须有序
-d:只看重复行
-u:只看唯一行 - join 合并两个文件中的有序数据
用法:join [-i] [-a1|v1] [-a2|-v2] [-1 field1] [-2 field2] file1 file2
根据每行的共通处合并文件,只输出有匹配的字段
要求数据有序
-a1 始终保留第一个文件的信息
-a2 始终保留第二个文件的信息
-i 忽视大小写 - tsort 偏序创建全序
- strings
概念:
1)96个可显字符:制表符、空格、标点、数字、字母
2)只包含可显示字符的文件称为文本文件。
3)二进制文件时任何非文本文件的非空文件。
用法:strings [-length] [file…] - tr 转换字符
用法:tr [-cds] [set1 [set2]]
例如:tr abc AB < old > new
set1 set2 为字符组
将“a” 替换为“A”, b替换成“B” ,“c"替换成"B”
例如:tr 0-9 A-J < old > new
-s squeeze 多个字符挤压为一个,一起转换
-d 删除
-c complement,匹配所有不在第一组set1中的字符
注:[:lower:]=a-z [:upper:]=A-Z [:digit:]=0-9
注2: 不可显字符 ‘\n’ = 转换 新行
代码 | 控制键 | 八进制码 | 名称 |
---|---|---|---|
\b | ^H | \010 | 退格 |
\t | ^I | \011 | 制表符 |
\n | ^J | \012 | 新行 |
\r | ^M | \015 | 回车 |
\ | - | - | 反斜杠 |
- sed 非交互式文本编辑
用法:sed [-i] command | -e command… [file…]
-i: in place 替换
sed ‘s/xx/XXX/g’ file | less
[/address|pattern/]s/search/replacement/[g]
不加g:只改没行出现的第一个search 结果
-g:global
address选择:5,10 5,$(5到最后一行)
正则表达式 regular expression, regex
元字符 | 含义 |
---|---|
. | 任意单个字符 |
^ | 匹配行首 |
$ | 匹配行末 |
< | 匹配单词开头 |
> | 匹配单词结尾 |
[list] | 匹配list中的任何字符 |
[^list] | 匹配不在list中的任何字符 |
() | 组:视为一个单独的单元 |
| | 交变:匹配选择之一 |
\ | 引用:字面上解释元字符 |
运算符 | 含义 |
---|---|
X? | 匹配出现零次或一次的大写字母 X。 |
X* | 匹配零个或任意个大写 X。 |
X+ | 匹配一个或多个字母 X。 |
X{n} | 精确匹配 n 个字母 X。 |
X{n,m} | 匹配最少 n 个并且不超过 m 个字母 X。如果省略 m,表达式将尝试匹配最少 n 个 X。 |
注:花括号有时需要➕\{才可使用
类 | 含义 | 类似于 |
---|---|---|
[:lower:] | 小写字母 | a-z |
[:upper:] | 大写字母 | A-Z |
[:alpha:] | 大小写字母 | A-Za-z |
[:album:] | 大小写字母、数字 | A-Za-z0-9 |
[:digit:] | 数字 | 0-9 |
[:punct:] | 标点符号 | — |
[:blank:] | 空格或制表符(空白符) | — |
grep 'Harley$' data # 匹配在行末的Harley
grep '21[[:alpha:]]' data # 21a,21C,21X均符合
grep 'error.*code' data # error后面跟0个或多个字符,再跟code
grep '\<(cat|dog)\>' /usr/share/dict/words # 圆括号创建组
文件查看
less
- 操作
空格向后翻页,b向前翻页,q退出,h显示帮助
/ 向前搜索 ?向后搜索 n 重复执行搜索 N 向后重复执行搜索 -option 设置选项 _option显示选项 - 用法
less [-cCEFmMs] [+command] [-x tab] [file…]
-s squeeze white space
-m more 显示当前阅读百分比
-M 显示文件和行号
-E 翻到最后自动退出
-F 在整个文件可以一次显示时自动退出
+ 从什么位置开始显示数据 +G=从文件结尾开始
-I ignore case
vi
- 用法:vi [-rR] [file…]