Unix 自学笔记1: Unix基本知识和常用过滤器

注:本人为Mac用户,用书为《Unix&Linux大学教程》,用的shell是系统默认的bash。

Unix 工作环境

多任务处理系统

Unix 可以同时执行多个任务,但是,单个处理器同一时间只能运行单个进程(process)。所以,Unix允许单一进程在极短的时间(时间片 time slice, 通常为10ms)内使用处理器,而由调度器分配处理器的使用。

多个终端和GUI终端

  1. Unix允许用户启动多个终端(多个CLI终端+GUI终端)。
  2. 当需要从一个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键盘使用

  1. Teletype,缩写tty,是最初的终端,和现在的键盘类似,Return和Line Feed 分为连个键。Unix系统上终端的名字也叫tty。(stty:set tty设置终端,gtty:打开终端通信。)输出 = 在卷筒纸上打印print。pwd = print working directory。
  2. 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	# 一行输入两个命令

手册阅读事项

  1. 方框中可选。不在方框中为必选。
  2. 黑体字原样输入。
  3. 斜体字用适合值代替。
  4. … 表示可以重复任意多次。
  5. 如果一个单独选项和一个参数组合在一起,两者必须同时使用。 例:man [-P pager] [-S sectionlist] name
  6. 用竖线分开的两个或多个项,表示可以从中任选一个(或不选)。例: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

  1. 交互式: 我们使用的terminal
  2. 非交互式: 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查看
  • 重定向

    • 标准输入、标准输出、标准错误(错误信息)
    • 重定向
      • [标注输出]>覆盖原有输出文件,>>追加,仅有标准输出被重定向,标准错误仍显示在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 过滤器

基本过滤器

  1. cat 文件连接
# cat -n(输出加行号)-b(和-n连用,不要给空白航加行号)-s(多个空白行用一个空白行替代)
cat >> data		# 将标准输入append到data这个文件中
cat data		# 将terminal中显示data的内容
# 等同于
cat < data
  1. split 文件划分
# split [-d(输出文件以数字命名)] [-a(后缀位数] [-l lines(每个文件的行数)] [file [prefix 输出文件的前缀]]
split -l 5000 data	# 把data分成每个5000行的文件
  1. tac[mac 上没有???等价于 tail -r [filename]]
    和cat一样,但输出顺序反转

  2. rev 各行字符反转
    abc
    def
    变为
    cba
    fed

  3. head/ tail

head [-n lines]		# 显示头十行
tail [-n lines]
  1. sort 排序
sort name address	# 排序
  1. colrm 删除列
colrm [startcol [endcol]]

比较类过滤器

  1. cmp
    输出两个文件第一个不同的byte,可以比较任意文件
  2. comm 比较有序文本(&较小)文件
    分三列显示,第一列为第一个文件独有的,第二列为第二个文件独有的,第三列为两者共同的
    -123(取消第n列第输出)
  3. 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补到前一版本即可
  4. 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,以逗号为定界符)
  5. paste 组合数据列
    水平组合数据
    用法:paste [-d char…] [file…]
    如果指定了多个 delimiter,将会轮流使用。

统计和格式化过滤器

  1. nl 创建行号
    用法: nl [-v start] [-i increment] [-b a] [-n ln|rn|rz] [file…]
    start 起始数字
    increment 增量
    -b a 强制对空行编号
    -n ln(编号左对齐) rn(右对齐) rz(右对齐,有前导0)
  2. wc 统计行单词字符的数量
    用法:wc [-clLw] [file…]
    输出 行数 单词数 字符数
    (多个文件还输出总和)
    -c(字符) -l(行数)-w(字数)-L(最长行长度)
  3. 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)
  4. fold将长行折成短行
    用法:fold [-s] [-w width] [file…]
    -s 不分割单词
    -w 每行宽度,默认行宽为80字符/行
  5. fmt格式化段落
    用法:fmt [-su] [-w width] [file…]
    -u uniform spacing 单词之间最多只有一个空格,句子末尾最多两个空格(* fmt不增加空格,只减少空格)
    -w width
    -s split only,不连接短行
  6. pr 格式为适合打印的文本

选取、排序、组合及变换

  1. grep 选取包含特定模式的行
    用法:grep [-cilLnrsvwx] pattern [file…]
    -c count, 显示包含该模式的行的数量
    -i case insensitive
    -n 显示包含模式的行在文本中的行号
    -l 在多个文件中查找特定模式时,显示含有该模式的文件的文件名
    -L 与-l相反,列举不包含该模式的文件的文件名
    -w 指定只搜索完整的单词
    -v reverse,显示不包含某模式的行
    -x 搜索模式占用整行的行
    -r 在指定目录中的所有文件中搜索
    -s 抑制错误信息
  2. fgrepegrep
    fgrep fast版本的grep
    egrep 扩展版本的grep
  3. look 选取以特定模式开头的行
    用法1:look [-df] pattern file…
    不能从标准输入中读入,文件必须已经排序过!!!
    -d dictionary 只考虑字母和数字
    -f 忽略大小写的区别
    用法2:look pattern
    查找所有以pattern开头的单词
  4. sort 排序
    用法:sort [-dfnru] [-o outfile] [infile…]
    -o outfile 主要用于outfile和infile 相同(重定向不可用)
    -d 只查看字母数字空白符
    -f fold 忽略大小写区别
    -n 字段开头数字从小到大排
    -r 反向排序
    -u unique,去除重复行
    -c check检查数据是否有序 -cu 有序且唯一
    *Ascii码序 空格数字大写小写
    *locale 设置地区
  5. uniq 查找重复行
    用法:uniq [-cdu] [infile [outfile]]
    必须有序
    -d:只看重复行
    -u:只看唯一行
  6. join 合并两个文件中的有序数据
    用法:join [-i] [-a1|v1] [-a2|-v2] [-1 field1] [-2 field2] file1 file2
    根据每行的共通处合并文件,只输出有匹配的字段
    要求数据有序
    -a1 始终保留第一个文件的信息
    -a2 始终保留第二个文件的信息
    -i 忽视大小写
  7. tsort 偏序创建全序
  8. strings
    概念:
    1)96个可显字符:制表符、空格、标点、数字、字母
    2)只包含可显示字符的文件称为文本文件。
    3)二进制文件时任何非文本文件的非空文件。
    用法:strings [-length] [file…]
  9. 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 回车
\ - - 反斜杠
  1. 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

  1. 操作
    空格向后翻页,b向前翻页,q退出,h显示帮助
    / 向前搜索 ?向后搜索 n 重复执行搜索 N 向后重复执行搜索 -option 设置选项 _option显示选项
  2. 用法
    less [-cCEFmMs] [+command] [-x tab] [file…]
    -s squeeze white space
    -m more 显示当前阅读百分比
    -M 显示文件和行号
    -E 翻到最后自动退出
    -F 在整个文件可以一次显示时自动退出
    + 从什么位置开始显示数据 +G=从文件结尾开始
    -I ignore case

vi

  1. 用法:vi [-rR] [file…]
发布了6 篇原创文章 · 获赞 5 · 访问量 257

猜你喜欢

转载自blog.csdn.net/weixin_44459654/article/details/86765661