文章较长,如有需要可复制至word中保存,使用导航窗口,搜索匹配会快一点。蓝色字体为超链接。
一、基本概念:
1、Shell简介:
操作系统的壳能够接受用户指令理解用户的命令,并将其翻译传输给内核,再由内核指挥应用程序的一个界面(interface 界面/接口)
1)图形界面的shell: GUI(图形用户界面 ):Graphic User Interface
2)字符界面的shell:CLI (命令行接口)
灵活使用命令行的话,其操作速度快于图形界面操作。
3)Bash简介:
bash,全称为Bourne-Again Shell。它是一个为GNU项目编写的Unix shell。 bash是绝大多数Linux发行版默认的Shell,Google的shell脚本规范甚至就指明必须使用bash。
2、内核kernel:
管理硬件资源,并且将硬件资源虚拟成其他样子提供给上层所需要运行的应用程序。
3、通配符:
通配符 | 作用 |
---|---|
? | 匹配任意单个字符 |
* | 匹配任意长度任意字符 |
** | 匹配任意级别目录(bash 4.0以上版本支持,shopt -s globstar) |
[] | 匹配一个单字符范围,如[a-z],[0-9] |
用法:通配符范例:
*.txt # 匹配全部后缀为.txt的文件
file?.log # 匹配file1.log, file2.log, ...
[a-z]*.log # 匹配a-z开头的.log文件
[^a-z]*.log # 上面的反向匹配
NOTE: 反斜杠(\)或引号(', ")都会使通配符失效。
如:\ *, "*", '*'都表示*本身,不通配任何文件。
4、展开式:
Bash的{}表达式内的部分也会像通配符一样,被Bash自解释。 {}展开效果非常类似于数学公式中的多项式积。
5、文件类型
Linux的文件类型有以下几种:
文件类型 | ls -l显示 |
---|---|
普通文件 | - |
目录 | d |
符号链接 | l |
字符设备 | c |
块设备 | b |
套接字 | s |
命名管道 | p |
列出文件内容类型可以用file: file /bin/ls
6、软链接和硬链接
- 软连接(也称作符号链接——symbolic link, symlink or soft link), 是一类特殊的文件, 其包含有一条以绝对路径或者相对路径的形式指向其它文件或者目录的引用。
它是一个独立文件,其存在并不依赖于目标文件。如果删除一个符号链接,它指向的目标文件不受影响。如果目标文件被移动、重命名或者删除,任何指向它的符号链接仍然存在,但是它们将会指向一个不复存在的文件。这种情况被有时被称为被遗弃。
在Linux中,创建软连接的方法是使用ln -s:
$ ln -s /etc/bashrc /tmp/bashrc
$ ln -s /etc/bashrc . # 目标可以不是完整的文件名
$ ln -s /etc/ dir # 源和目标名可以不一样, 目标也可以是相对路径
查看软连接的指向可以用ls -l
删除软连接就如同删除普通文件一样,使用rm symlink
即可。
- 硬连接, 指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。
在Linux中,创建硬链接的方法是ln:
$ ln file1 file2
硬链接的几个限制:
硬链接创建时要求源文件必须存在
不允许给目录创建硬链接(注意是不能通过ln的方式)
只有在同一文件系统才能创建硬链接
7、时间戳
文件共有3个时间戳,Access time(atime), Modify time(mtime), Change time(ctime)。
Birth time(创建时间)在Linux中已经废弃,目前一般都是-。
这里重点比对一下Modify和Change:
Modify: 表示文件内容被修改的时间
Change: 表示文件被修改的时间(包括内容和元数据)
用stat命令可以查看文件的时间戳
$ stat /tmp/file
File: ‘file’
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd01h/64769d Inode: 2228469 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2015-12-13 17:21:52.117050496 +0800
Modify: 2015-12-13 17:21:52.117050496 +0800
Change: 2015-12-13 17:21:52.117050496 +0800
Birth: -
touch命令即可修改元数据中的时间戳:
touch file # 将Access, Modify, Change均修改为当前时间
$ touch -a file # 将Access, Change均修改为当前时间
$ touch -m file # 将Modify, Change均修改为当前时间
8、重定向
重定向就是改变原有的输入或输出文件。使命令从其他文件接受输入,或者输出到其他文件中去。
- 输出重定向有两种符号: >和>>
n>: 将输出从文件描述符 n 重定向到文件。您必须具有该文件的写权限。如果该文件不存在,将创建它。如果该文件已经存在,通常将覆盖所有现有内容,并且没有任何警告。
n>>: 和上面唯一的不同在于, 如果目标文件存在, 则追加重定向内容到文件尾部, 而不是覆盖原文件。
n>&-: Close output file descriptor n.
NOTE: 文件描述符n和重定向符号>|>>之间不能有空格, 若省略,则默认1。
$ ls > file_list.txt
$ find --help > find_help.txt
$ cat /etc/passwd >> passwd
$ ls x* z* >stdout.txt 2>stderr.txt - 输入重定向的字符是<和<<
<: 代表从其他某一文件接收输入,而不是默认的/dev/stdin
<<: here-document 形式重定向, 代表将一段标记为 here-document 的文本作为输入
n<&-: Close input file descriptor n.
$ cat < file
$ tr ':' ',' < /etc/passwd
$ sort < file
9、管道
管道是一种特殊的重定向方式,用于将一个命令的输出重定向到另一个命令的输入。管道可以分为两种: 匿名管道与命名管道
- 匿名管道
使用pipe(man 2 pipe)函数(C函数)或|即可创建匿名管道,由于使用频率实在太高,通常管道不特别说明, 都指的是匿名管道,甚至|符号本身也常称为管道符。
管道的用法很简单,用管道符|将多个命令连接即可:
COMMAND1 | COMMAND2 [| COMMANDn]...
匿名管道有几个特点:
管道连接的几个命令是并行执行的,而不是串行
管道中有任意一个命令退出时,整个管道连接的所有命令将全部退出
管道的退出码是最后一条命令的退出码
- 命名管道
命名管道(FIFO, 也称named pipe),是另一种进程的通信方式。与匿名管道不同, 该管道将具象化为一个具体的文件,而且可以在不相关的进程间建立通信关系,效果就如同匿名管道的那样。
在Linux中,使用mkfifo命令或mkfifo函数(C函数)将创建一个命名管道。
$ mkfifo myfifo # 创建一个名为myfifo的FIFO
$ cat > myfifo <<EOF
first line
last line
EOF # 向这个myfifo这个命名管道写入一些内容
# 打开一个新终端
$ cat myfifo # 读取命名管道,将获取到之前写入的内容
$ rm myfifo # 删除命名管道,就像删除一个普通文件一样
十、发行版与内核的关系
系统组成: Linux内核、库、应用程序
内核、库、应用程序都以源代码的形式提供,需要编译成二进制电脑可识别文件,厂商将其编译,并提供能够安装的载体,称其为发行版。
发行版(三大主流):Fedora(为Redhat提供测试), RedHat (CentOS), SUSE, Debian(Ubuntu, Mint)
Debian相比其他轻量限制少,但是比较难。
详见 : https://www.jianshu.com/p/3a3d068ab14c
十一、相对路径和绝对路径
- 绝对路径永远都是相对于根文件夹的。它们的标志就是第一个字符永远都是“/”。如/var/log/syslog
- 相对路径永远都是相对于我们所处的文件夹位置。它们的第一个字符没有“/”。dir1/dir2/dir3
二、小技巧
1、查看历史命令时,可以使用上箭头/下箭头进行上翻/下翻历史命令。再次回车可以继续执行该条命令。
2、history命令可以按顺序列出最近执行的命令。
使用!n可以使用第n条历史命令
使用!!可以执行最后一条历史命令(sudo !! √)
使用!word执行以word开头的命令
ctrl+r可以按关键字搜索历史命令
3、快捷键:
- shift+PageUp: 向上翻页
- shift+PageDown: 向下翻页
- ctrl+r: 进入历史查找命令记录, 输入关键字。 多次按返回下一个匹配项
- ctrl+c: 发送Interrupt信号,常用于取消未输入完整的命令,或中断当前正在执行的命令
- ctrl+d: 发送EOF信号,常用于登出交互式shell,或结束STDIN
- ctrl+z: 给当前正在运行的命令发送SIGTSTP,将导致被后台挂起
- Bash补全的按键是<TAB>,可以实现命令与路径的补全。唯一补全结果会立刻补全,非唯一补全结果需要按两下<TAB>,同时显示结果是可用补全列表.
- 清屏:Ctrl+L快捷键 或者 clear 命令
三、基本命令:
格式:command [options] [arguments]
command:命令
options:--单词 或 -单字
arguments:参数,有时候选项也带参数。
在查看命令帮助时,会出现[],<>,|等符号,它们的含义如下:
无任何特殊符号 代表必选参数
[] 表示是可选的;
<> 表示可变选项,一般是多选一,而且必须是要选其一。
x|y|z 多选一,如果加上[],可不选。如果加上{},必选其一。
-abc 多选,如果加上[],可不选。
获取帮助:
1、内建命令帮助: 使用help COMMAND
的形式即可,如help cd
2、大多数外部命令都有带有帮助参数,通常为COMMAND -h|--help
, 如cat --help
3、打开帮助手册的命令为man COMMAND
, 如:man find
1、echo:在终端上打印字符串到标准输出。
Usage: echo [-neE] [arg ...]
常用参数:
-e: 启用特殊转义字符(\t, \b, \n等)
-n: 行末不添加换行符
2、ls:显示指定目录的文件。
Usage: ls [OPTION]... [FILE]...
常用参数:
-a: 列出所有文件,包含隐藏文件
-R: 递归目录列出文件
-d: 显示目录本身,而非目录下文件
ls的输出颜色有以下几种:
白色:表示普通文件
蓝色:表示目录
绿色:表示可执行文件
红色:表示压缩文件
浅蓝色:链接文件
红色闪烁:表示链接的文件有问题
黄色:表示设备文件
灰色:表示其他文件
3、cd:切换当前的工作目录
Usage: cd [-L|[-P [-e]] [-@]] [dir]
用法示例:
$ cd /path/ # 跳转到指定目录
$ cd # 跳转到家目录
$ cd ~ # 跳转到家目录
$ cd ~USERNAME # 跳转到指定用户的家目录
$ cd - # 跳转到上一次所在目录
$ cd .. # 跳转到上一级目录
$ cd ../.. # 跳转到上两级目录
4、cat:打开文件
Usage: cat [OPTION]... [FILE]...
常用参数:
-n: 显示行号
cat+文件名 打印当前目录下的某文件内容(不需要gui系统)
cat >文件名 创建新的文件 Ctrl+c 终止创建。
5、tac +文件名 :倒序打印文件内容。
6、pwd:显示当前工作目录
7、vi 命令:
vi可以分为三种状态,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:
命令行模式command mode):控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode。
插入模式(Insert mode):只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。
底行模式(last line mode):将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号……等。
不过一般我们在使用时把vi简化成两个模式,就是将底行模式(last line mode)也算入命令行模式command mode)。
如何进入一个文件并进行编辑并保存呢?使用vi即可:
- 第一步:vi + 文件名 如:vi ~/.bashrc (进入家目录即用户目录的.bashrc文件),如无此文件,则为创建该文件。
- 第二步:按a,进入插入模式,修改内容或添加内容。按i/o也可进入插入模式。差别如下:
按「i」切换进入插入模式「insert mode」,按"i"进入插入模式后是从光标当前位置开始输入文件;
按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字;
按「o」进入插入模式后,是插入新的一行,从行首开始输入文字。 - 第三步:保存并退出:按「ESC」键进入命令行模式,输入
:wq
保存并退出,输入: q!
不保存退出。
8、别名:简化某些常用的命令及参数。
用法:alias new_alias="command args"
如:alias cdl="cd -"
永久生效将alias命令写入~/.bashrc中即可。使用命令:vi ~/.bashrc
把new_alias="command args"
放进去,保存退出。
9、压缩与解压缩:
gzip FileName 压缩为.gz文件
gunzip FileName.gz 解压.gz文件
bzip2 a.tar 压缩某文件,生成.bz2文件
bunzip2 a.tar.bz2 解压.bz压缩文件
tar -zcvf a.tar.gz a.tar 将a.tar压缩为a.tar.gz (压缩率比bz高)
tar -zxvf a.tar.gz 可以解压tar.gz文件
tar -jcvf a.tar.bz2 a.tar 将a.tar压缩为a.tar.bz2
tar -jxvf a.tar.bz2 可以解压tar.bz压缩文件
解压:unzip FileName.zip -d dir
压缩:zip FileName.zip DirName
解压:rar x FileName.rar
压缩:rar a FileName.rar DirName
10、文件的搜索
文件搜索有两种: locate和find。
- locate是通过文件索引数据库查找的,速度快,但是不具有实时性。
手工更新文件索引数据库可以使用updatedb,之后就可以使用locate filename来查找文件。
>updatedb
>locate filename
-
find功能十分强大,属于实时查找,相比locate会比较慢,但是拥有更多更强的特性。
NAME
find - search for files in a directory hierarchy
SYNOPSIS
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]
find命令高频参数:
-type: 指定查找的文件类型,如f,d,l等
-name/-iname: 指定要查找的文件名,支持通配符
-perm: 指定要查找的文件的mode
-[amc]time: 指定文件的atime,mtime,ctime
-exec: 对找出的文件执行外部命令操作
目录操作:
1、创建目录:
mkdir dir
mkdir -p /tmp/dir1/dir2/dir3
2、列出目录内容:
ls [-R] /path/to/dir
tree [/path/to/dir]
3、拷贝目录:
cp -r dir1 dir2
4、删除目录:
>rmdir dir
>rmdir -p /tmp/dir1/dir2/dir3
>rm -fr /path/to/delete
Warning: rm 十分危险,几乎能删除任何你想删掉的文件,被rm删掉的文件很难找回。
特别提醒,尤其是-r -f参数连用的时候需谨慎,且用且珍惜!
5、移动/重命名目录:
mv /path/to/dir1 /path/to/dir2
文件操作:
1、创建一个空文件:
touch file...
cat> file
vi file
2、复制文件:
cp file1 file2
cp SRC... DST
# 拷贝多个文件到指定目录
3、删除文件:
rm file1 [file2]...
4、移动/重命名文件:
mv /path1/to/file1 /path2/to/[file2]
文本文件的处理:
1、查看文本文件
1)cat 文件名
[root@localhost test]# cat a.txt
afceggn
ckk
czvbb
ssvx
ervt
附:
查看文件的大小:
du -h 文件名
-h或--human-readable 以K,M,G为单位,提高信息的可读性。
2)more:会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能 。more命令从前向后读取文件,因此在启动时就加载整个文件。
more [-dlfpcsu ] [-num ] [+/ pattern] [+ linenum] [file ... ]
+n 从笫n行开始显示
-n 定义屏幕大小为n行
+/pattern 在每个档案显示前搜寻该字串(pattern),然后从该字串前两行之后开始显示
-c 从顶部清屏,然后显示
-d 提示“Press space to continue,’q’ to quit(按空格键继续,按q键退出)”,禁用响铃功能
-l 忽略Ctrl+l(换页)字符
-p 通过清除窗口而不是滚屏来对文件进行换页,与-c选项相似
-s 把连续的多个空行显示为一行
-u 把文件内容中的下画线去掉
3)less:对文件或其它输出进行分页显示的工具
less [参数] 文件
空格键 滚动一行
回车键 滚动一页
[pagedown]: 向下翻动一页
[pageup]: 向上翻动一页
q 退出浏览
4)head:用来显示文档的开头至标准输出中,默认显示十行。
head 文件
-c, --bytes=[-]K 显示每个文件的前K 字节内容;如果附加"-"参数,则除了每个文件的最后K字节数据外 显示剩余全部内容
-n, --lines=[-]K 显示每个文件的前K 行内容;如果附加"-"参数,则除了每个文件的最后K行外 显示剩余全部内容
-q, --quiet, --silent 不显示包含给定文件名的文件头
-v, --verbose 总是显示包含给定文件名的文件头
--help 显示此帮助信息并退出
--version 显示版本信息并退出
[root@localhost test]# cat a.txt
afceggn
ckk
czvbb
ssvx
ervt
ac
fcva
vsxfdb
svfst
hbgfdtbtny
bc
bdyd
bxfg
bxfgn
xnbgcmj
c
xnghgc
nchg
xngkmhj
fjjufkf
dghhyyj
nj
[root@localhost test]# head a.txt
afceggn
ckk
czvbb
ssvx
ervt
ac
fcva
vsxfdb
svfst
hbgfdtbtny
[root@localhost test]# head a.txt
afceggn
ckk
czvbb
ssvx
ervt
ac
fcva
vsxfdb
svfst
hbgfdtbtny
5) tail 把某个文件的最后几行显示到终端上,默认显示后十行,假设该文件有更新,tail会自己主动刷新,确保你看到最新的文件内容。
[root@localhost test]# tail a.txt
bxfg
bxfgn
xnbgcmj
c
xnghgc
nchg
xngkmhj
fjjufkf
dghhyyj
nj
2、修改/编辑文本文件
1):使用文本编辑器,终端下常见文本编辑器: vim, emacs, nano
nano /etc/passwd
vim /etc/services
emacs /etc/sudoers
2):使用非交互式脚本处理:sed命令
sed -i
-i :直接修改读取的文件内容,而不是输出到终端。
3):统计文本信息
wc (word count)统计有几行,有几个单词,有几个字节(空白行有空格键算有字节,没有空格键不算)
-l : 只显示行数
-w : 只显示单词数
-c : 只显示字节数
-m : 只显示字符数
字符与字节的差别
4):文本处理
1、cut: remove sections from each line of files
-d :指定字段分隔符(默认一个空格)
-f : 指定要显示的字段。-f 1,3 显示第一和第三个字段。 -f 1-3 :显示第一到第三个字段。
-c/b : 输出由bytes指定的位置处字节
\$ cut -d: -f1,7 /etc/passwd
#以:
分隔,显示第一和第七字段
2、sort: sort lines of text files 对文件的数据进行排序(默认根据ASCII表升序排列)
-u 对排序后认为相同的行只留其中一行。
-r 逆序输出。
-t<分隔字符> 指定排序时所用的栏位分隔字符。
3、uniq: report or omit repeated lines 报告或略过重复行(相邻才重复)。
-d :只显示重复的行(只显示一次)
-D : 只显示重复的行(显示多次)
-c : 显示文件中行的重复次数
\$ sort /tmp/text | uniq
# 效果等同于sort -u
4、grep: print lines matching a pattern
grep [选项] ”模式“ [文件]
选项:
-E :开启扩展(Extend)的正则表达式。
-i :忽略大小写(ignore case)。
-v :反过来(invert),只打印没有匹配的,而匹配的反而不打印。
-n :显示行号
-w :被匹配的文本只能是单词,而不能是单词中的某一部分,如文本中有liker,而我搜寻的只是like,就可以使用-w选项来避免匹配liker
-c :显示总共有多少行被匹配到了,而不是显示被匹配到的内容,注意如果同时使用-cv选项是显示有多少行没有被匹配到。
-o :只显示被模式匹配到的字符串。
--color :将匹配到的内容以颜色高亮显示。
-A n:显示匹配到的字符串所在的行及其后n行,after
-B n:显示匹配到的字符串所在的行及其前n行,before
-C n:显示匹配到的字符串所在的行及其前后各n行,context
模式:
1、直接输入要匹配的字符串
2、使用基本正则表达式
5、sed命令
其他命令:
1、which指令:用于查找文件,会在环境变量$PATH设置的目录里查找符合条件的文件。
-n<文件名长度> 指定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名。
-p<文件名长度> 与-n参数相同,但此处的<文件名长度>包括了文件的路径。
-w 指定输出时栏位的宽度。
-V 显示版本信息。
2、whereis :用于查找文件。
该指令会在特定目录中查找符合条件的文件。这些文件应属于原始代码、二进制文件,或是帮助文件。
该指令只能用于查找二进制文件、源代码文件和man手册页,一般文件的定位需使用locate命令。
whereis [-bfmsu][-B <目录>...][-M <目录>...][-S <目录>...][文件...]
-b 只查找二进制文件。
-B<目录> 只在设置的目录下查找二进制文件。
-f 不显示文件名前的路径名称。
-m 只查找说明文件。
-M<目录> 只在设置的目录下查找说明文件。
-s 只查找原始代码文件。
-S<目录> 只在设置的目录下查找原始代码文件。
-u 查找不包含指定类型的文件。