Linux基础入门笔记
基本概念及操作
一些常用快捷键
按键 | 作用 |
---|---|
Ctrl+d | 键盘输入结束或退出终端 |
Ctrl+s | 暂定当前程序,暂停后按下任意键恢复运行 |
Ctrl+z | 将当前程序放到后台运行,恢复到前台为命令fg |
Ctrl+a | 将光标移至输入行头,相当于Home键 |
Ctrl+e | 将光标移至输入行末,相当于End键 |
Ctrl+k | 删除从光标所在位置到行末 |
Alt+Backspace | 向前删除一个单词 |
Shift+PgUp | 将终端显示向上滚动 |
Shift+PgDn | 将终端显示向下滚动 |
Shell常用通配符
字符 | 含义 |
---|---|
* | 匹配 0 或多个字符 |
? | 匹配任意一个字符 |
[list] | 匹配 list 中的任意单一字符 |
[!list] | 匹配 除list 中的任意单一字符以外的字符 |
[c1-c2] | 匹配 c1-c2 中的任意单一字符 如:[0-9] [a-z] |
{string1,string2,…} | 匹配 sring1 或 string2 (或更多)其一字符串 |
{c2..c2} | 匹配 c1-c2 中全部字符 如{1..10} |
用户及文件权限管理
查看用户
1 | $ who am i |
who 命令其他常用参数
参数 | 说明 |
---|---|
-a | 打印能打印的全部 |
-d | 打印死掉的进程 |
-m | 同am i,mom likes |
-q | 打印当前登录用户数及用户名 |
-u | 打印当前登录用户登录信息 |
-r | 打印运行等级 |
创建用户
在Linxu系统里,root账户拥护整个系统至高无上的权利,比如 新建/添加用户。
su,su-与sudo
su
新建用户1
$ sudo adduser lilei
切换登录用户1
$ su -l lilei
退出当前用户跟退出终端一样可以使用 exit 命令或者使用快捷键 Ctrl+d。
用户组
查看所属用户组
方法一:使用groups命令1
$ groups lilei
方法二:查看etc/group文件1
$ cat /etc/group | sort
cat 命令用于读取指定文件的内容并打印到终端输出, | sort 表示将读取的文本进行一个字典排序再输出,然后你将看到如下一堆输出
可以使用命令过滤掉一些你不想看到的结果1
$ cat /etc/group | grep -E "用户名"
etc/group 文件格式说明
/etc/group 的内容包括用户组(Group)、用户组口令、GID 及该用户组所包含的用户(User),每个用户组一条记录。格式如下:
group_name:password:GID:user_list
你看到上面的 password 字段为一个 ‘x’ 并不是说密码就是它,只是表示密码不可见而已。
将其它用户加入 sudo 用户组
1 | $ su -l lilei |
删除用户
1 | $ sudo deluser lilei --remove-home |
查看文件权限
使用较长格式列出文件:1
$ ls -l
图解:
可能你还是不太明白,比如第一项文件类型和权限那一堆东西具体指什么,链接又是什么,何为最后修改时间,下面一一道来:
- 文件类型
关于文件类型,这里有一点你必需时刻牢记Linux 里面一切皆文件,正因为这一点才有了设备文件( /dev
目录下有各种设备文件,大都跟具体的硬件设备相关)这一说,还有 socket
(网络套接字,具体是什么,感兴趣的用户可以自己去了解或期待实验楼的后续相关课程),和 pipe
(管道,这个东西很重要,我们以后将会讨论到,这里你先知道有它的存在即可)。软链接文件,链接文件是分为两种的,另一种当然是“硬链接”(硬链接不常用,具体内容不作为本课程讨论重点,而软链接等同于 Windows 上的快捷方式,你记住这一点就够了)
- 文件权限
读权限,表示你可以使用 cat <file name>
之类的命令来读取某个文件的内容;写权限,表示你可以编辑和修改某个文件;
执行权限,通常指可以运行的二进制程序文件或者脚本文件,如同 Windows 上的 ‘exe’ 后缀的文件,不过 Linux 上不是通过文件后缀名来区分文件的类型。你需要注意的一点是,一个目录要同时具有读权限和执行权限才可以打开,而一个目录要有写权限才允许在其中创建其它文件,这是因为目录文件实际保存着该目录里面的文件的列表等信息
所有者权限,这一点相信你应该明白了,至于所属用户组权限,是指你所在的用户组中的所有其它用户对于该文件的权限,比如,你有一个艾派德,那么这个用户组权限就决定了你的兄弟姐妹有没有权限使用它破坏它和占有它。
链接数
链接到该文件所在的 inode 结点的文件名数目(关于这个概念涉及到 Linux 文件系统的相关概念知识,不在本课程的讨论范围,感兴趣的用户可以自己去了解)。
文件大小
以 inode 结点大小为单位来表示的文件大小,你可以给 ls 加上
-lh
参数来更直观的查看文件的大小。
明白了文件权限的一些概念,我们顺带补充一下关于 ls
命令的一些其它常用的用法:
- 显示除了 ‘.’(当前目录),’..’ 上一级目录之外的所有包含隐藏文件(Linux 下以 ‘.’ 开头的文件为隐藏文件)
可以同时使用“-A”和“-l”参数:1
$ ls -Al
查看某一个目录的完整属性,而不是显示目录里面的文件属性1
$ ls -dl <目录名>
显示所有文件的大小1
$ ls -AsSh
其中小 s 为显示文件大小,大 S 为按文件大小排序,若需要知道如何按其它方式排序
修改文件权限
对文件的权限做修改,这里有两种方式:
- 方式一:二进制数字表示
每个文件的三组权限(拥有者,所属用户组,其他用户,记住这个顺序是一定的)就对应这一个 “rwx”,也就是一个 ‘7’ ,所以如果我要将文件“iphone6”的权限改为只有我自己可以用那么就这样:
为了演示,我先在文件里加点内容:1
$ echo "echo \"hello shiyanlou\"" > iphone6
然后修改权限:
1 | $ chmod 700 iphone6 |
- 方式二:加减赋值操作
1 | go-rw iphone |
‘g’’o’还有’u’,分别表示group,others,user,’+’,’-‘ 就分别表示增加和去掉相应的权限。
FHS
FHS(英文:Filesystem Hierarchy Standard 中文:文件系统层次结构标准),多数 Linux 版本采用这种文件组织形式,FHS 定义了系统中每个区域的用途、所需要的最小构成的文件和目录同时还给出了例外处理与矛盾处理。
FHS 是根据以往无数 Linux 用户和开发者的经验总结出来的,并且会维持更新,FHS 依据文件系统使用的频繁与否以及是否允许用户随意改动(注意,不是不能,学习过程中,不要怕这些),将目录定义为四种交互作用的形态,如下表所示:
Linux目录结构及文件基本操作
目录路径
路径
使用 cd
命令可以切换目录,在 Linux 里面使用 .
表示当前目录,..
表示上一级目录(**注意,还记得我们上一节介绍过的,以 .
开头的文件都是隐藏文件,所以这两个目录必然也是隐藏的,你可以使用 ls -a
命令查看隐藏文件), -
表示上一次所在目录,~
通常表示当前用户的”home”目录。使用 pwd
命令可以获取当前所在路径(绝对路径)。
进入上一级目录:
1 | cd .. |
进入你的“home”目录:
1 | cd ~ |
使用 pwd
获取当前路径:1
pwd
绝对路径
关于绝对路径,简单地说就是以根”/“目录为起点的完整路径,以你所要到的目录为终点,表现形式如:/usr/local/bin
,表示根目录下的 usr 目录中的 local 目录中的 bin 目录。
相对路径
相对路径,也就是相对于你当前的目录的路径,相对路径是以当前目录 .
为起点,以你所要到的目录为终点,表现形式如:usr/local/bin
(这里假设你当前目录为根目录)。你可能注意到,我们表示相对路径实际并没有加上表示当前目录的那个 .
,而是直接以目录名开头,因为这个 usr
目录为 /
目录下的子目录,是可以省略这个 .
的(以后会讲到一个类似不能省略的情况);如果是当前目录的上一级目录,则需要使用 ..
,比如你当前目录为“home”目录,根目录就应该表示为 ../../
,表示上一级目录(”home”目录)的上一级目录(”/“目录)。
新建
新建空白文件
1 | $ cd ~ |
新建目录
创建名为”mydir”的空目录:1
mkdir mydir
使用 -p 参数,同时创建父目录(如果不存在该父目录),如下我们同时创建一个多级目录(这在有时候安装软件,配置安装路径时非常有用):1
$ mkdir -p father/son/grandson
复制
复制文件
1 | $ cp test father/son/grandson |
复制目录
1 | $ cp -r father family |
加上-r或者-R参数,表示递归复制
删除
删除文件
1 | $ rm test |
-f 参数强制删除1
$ rm -f test
删除目录
删除一个目录,也需要加上-r或-R参数1
$ rm -r family
移动文件与文件重命名
移动文件
使用mv
(move or rename files)命令,移动文件(剪切)。将文件”file1”移动到”Documents”目录mv 源目录文件 目的目录
:1
2$ mkdir Documents
$ mv file1 Documents
重命名文件
将文件”file1”重命名为”myfile” mv 旧的文件名 新的文件名
:1
$ mv file1 myfile
批量重命名
使用一个看起来更专业的命令rename来实现。不过它是要用 perl 正则表达式来作为参数,
1 | # 使用通配符批量创建 5 个文件 |
rename是先使用第二个参数的通配符匹配所有后缀为.txt的文件,然后使用第一个参数提供的正则表达式将匹配的这些文件的.txt后缀替换为.c,
查看文件
使用cat
,tac
和nl
命令查看文件
cat
为正序显示,tac
倒序显示。
cat 加上-n
参数显示行号:1
$ cat -n passwd
nl 的几个参数:1
2
3
4
5
6
7
8-b : 指定添加行号的方式,主要有两种:
-b a:表示无论是否为空行,同样列出行号("cat -n"就是这种方式)
-b t:只列出非空行的编号并列出(默认为这种方式)
-n : 设置行号的样式,主要有三种:
-n ln:在行号字段最左端显示
-n rn:在行号字段最右边显示,且不加 0
-n rz:在行号字段最右边显示,且加 0
-w : 行号字段占用的位数(默认为 6 位)
使用more
和less
命令分页查看文件
使用more
工具打开passwd
文件:1
$ more passwd
可以使用Enter键向下滚动一行,使用Space键向下滚动一屏,按下h显示帮助,q退出。
使用head
和tail
命令查看文件
1 | $ tail /etc/passwd |
加上-n参数,后面紧跟行数:1
$ tail -n 1 /etc/passwd
查看文件类型
1 | $ file /bin/ls |
环境变量与文件查找
环境变量
变量
1 | $ declare tmp #使用declare命令创建一个变量名为tmp的变量 |
注意:关于变量名,并不是任何形式的变量名都是可用的,变量名只能是英文字母,数字或者下划线,且不能以数字作为开头
环境变量
在所有的 UNIX 和类 UNIX 系统中,每个进程都有其各自的环境变量设置,且默认情况下,当一个进程被创建时,处理创建过程中明确指定的话,它将继承其父进程的绝大部分环境设置。Shell 程序也作为一个进程运行在操作系统之上,而我们在 Shell中运行的大部分命令都将以 Shell 的子进程的方式运行。
环境变量有三种:
- 当前 Shell 进程私有用户自定义变量,如上面我们创建的 temp 变量,只在当前 Shell 中有效。
- Shell 本身内建的变量。
- 从自定义变量导出的环境变量。
命令 | 说明 |
---|---|
set | 显示当前 Shell 所有环境变量,包括其内建环境变量(与 Shell 外观等相关),用户自定义变量及导出的环境变量 |
env | 显示与当前用户相关的环境变量,还可以让命令在指定环境中运行 |
export | 显示从 Shell 中导出成环境变量的变量,也能通过它将自定义变量导出为环境变量 |
注意:为了与普通变量区分,通常我们习惯将环境变量名设为大写
命令的查找路径与顺序
1 | $ echo $PATH #查看PATH环境变量的内容 |
添加自定义路径到”PATH”环境变量
1 | $ PATH=$PATH:/home/shiyanlou/mybin #PATH里面的路径是以:作为分隔符 |
修改和删除已有变量
变量修改
修改方式
变量设置方式 | 说明 |
---|---|
${变量名#匹配字串} | 从头向后开始匹配,删除符合匹配字串的最短数据 |
${变量名##匹配字串} | 从头向后开始匹配,删除符合匹配字串的最长数据 |
${变量名%匹配字串} | 从尾向前开始匹配,删除符合匹配字串的最短数据 |
${变量名%%匹配字串} | 从尾向前开始匹配,删除符合匹配字串的最长数据 |
${变量名/旧的字串/新的字串} | 将符合旧字串的第一个字串替换为新的字串 |
${变量名//旧的字串/新的字串} | 将符合旧字串的全部字串替换为新的字串 |
变量删除
可以使用unset
命令删除一个环境变量1
$ unset temp
环境变量生效
1 | $ source .zshrc #使用source命令来让变量立即生效 |
搜索文件
常见的命令:whereis
,which
,find
,locata
whereis
1
$whereis who #直接从数据库中查询,只能搜索二进制文件(-b),man帮助文件(-m)和源代码(-s)。
locate
1
2
3
4$ locate /etc/sh #查找 /etc 下所有以 sh 开头的文件,此方式通过"/var/lib/mlocate/mlocate.db"数据库查找
$ locate /usr/share/\*.jpg #查找 /usr/share/ 下所有 jpg 文件(添加*号前面的反斜杠转义)
-c #统计数目
-i #忽略大小写查找find
通过文件类型、文件名进行查找而且可以根据文件的属性(如文件的时间戳,文件的权限等)进行搜索1
$ find /etc/ -name interfaces #指定目录下搜索指定文件名的文件
注意 find 命令的路径是作为第一个参数的, 基本命令格式为 find [path] [option] [action]
参数 | 说明 |
---|---|
-atime | 最后访问时间 |
-ctime | 创建时间 |
-mtime | 最后修改时间 |
-mtime
参数举例:
-mtime n
: n 为数字,表示为在n天之前的”一天之内“修改过的文件-mtime +n
: 列出在n天之前(不包含n天本身)被修改过的文件-mtime -n
: 列出在n天之内(包含n天本身)被修改过的文件newer file
: file为一个已存在的文件,列出比file还要新的文件名
文件打包与压缩
文件打包和解压缩
文件后缀名 | 说明 |
---|---|
*.zip | zip程序打包压缩的文件 |
*.rar | 创建时间 |
*.7z | 7zip程序压缩的文件 |
*.tar | tar程序打包,未压缩的文件 |
*.gz | gzip程序(GNU zip)压缩的文件 |
*.xz | xz程序压缩的文件 |
*.bz2 | bzip2程序压缩的文件 |
*.tar.gz | tar打包,gzip程序压缩的文件 |
*.tar.xz | tar打包,xz程序压缩的文件 |
*tar.bz2 | tar打包,bzip2程序压缩的文件 |
*.tar.7z | tar打包,7z程序压缩的文件 |
zip压解打包程序
- 使用zip打包文件包
1 | $ zip -r -q -o shiyanlou.zip /home/shiyanlou #-r参数表示递归打包包含子目录的全部内容,-q参数表示为安静模式,即不向屏幕输出信息,-o,表示输出文件,需在其后紧跟打包输出文件名 |
- 设置压缩级别为9和1(9最大,1最小),重新打包:
1 | $ zip -r -9 -q -o shiyanlou_9.zip /home/shiyanlou -x ~/*.zip #设置压缩级别-[1-9] |
- 创建加密zip包
1 | $ zip -r -e -o shiyanlou_encryption.zip /home/shiyanlou #-e参数可以创建加密压缩包 |
在 Windows 为 CR+LF(Carriage-Return+Line-Feed:回车加换行),而在 Linux/Unix 上为 LF(换行),所以如果在不加处理的情况下,在 Linux 上编辑的文本,在 Windows 系统上打开可能看起来是没有换行的。
使用unzip命令解压缩zip文件
1 | $ unzip shiyanlou.zip #将shiyanlou.zip解压到当前目录 |
rar打包压缩命令
- 安装rar和unrar工具
1 | $ sudo apt-get update |
- 从指定文件或目录创建压缩包或添加文件到压缩包
1 | $ rm *.zip #a参数添加一个目录~到一个归档文件中,如果该文件不存在就会自动创建 |
注意:rar 的命令参数没有-,如果加上会报错
- 从指定压缩包文件中删除某个文件
1 | $ rar d shiyanlou.rar .zshrc |
查看不解压文件
1
$ rar l shiyanlou.rar
使用unrar解压rar文件
1
$ unrar x shiyanlou.rar #全路径解压
1 | $ mkdir tmp #去路径解压 |
tar打包工具
- 创建一个tar包
1
$ tar -cf shiyanlou.tar ~
-c
表示创建一个 tar 包文件,-f
用于指定创建的文件名,注意文件名必须紧跟在-f
参数之后,比如不能写成tar -fc shiyanlou.tar
,可以写成tar -f shiyanlou.tar -c ~
。你还可以加上-v
参数以可视的的方式输出打包的文件。上面会自动去掉表示绝对路径的/
,你也可以使用-P
保留绝对路径符。
解包一个文件(-x参数)到指定路径的已存在目录(-C参数)
1
2$ mkdir tardir
$ tar -xf shiyanlou.tar -C tardir只查看不解包文件-t参数
1
$ tar -tf shiyanlou.tar
保留文件属性和跟随链接
1
$ tar -cphf etc.tar /etc #还原时希望保留文件的属性(-p参数)和备份链接指向的源文件而不是链接本身(-h参数)
创建tar文件的基础上添加-z参数,使用gzip来压缩文件
1
$ tar -czf shiyanlou.tar.gz ~
解压*.tar.gz文件
1
$ tar -xzf shiyanlou.tar.gz
文件后缀名 | 说明 |
---|---|
*.tar.gz | -z |
*.tar.xz | -J |
*.tar.bz2 | -j |
文件系统操作与磁盘管理
简单文件系统操作
查看磁盘和目录的容量
使用df命令查看磁盘的容量
1 | $ df |
“rootfs” : (Root File System)它是 Ramfs(Ramfs 是一个非常简单的 Linux 文件系统用于实现磁盘缓存机制作为动态可调整大小的基于 ram 的文件系统)或者 tmpfs 的一个特殊实例,它作为系统启动时内核载入内存之后,在挂载真正的的磁盘之前的一个临时文件系统。通常的主机会在系统启动后用磁盘上的文件系统替换,只是在一些嵌入式系统中会只存在一个 rootfs ,或者像我们目前遇到的情况运行在虚拟环境中共享主机资源的系统也可能会采用这种方式。
物理主机上的 /dev/sda2 是对应着主机硬盘的分区,后面的数字表示分区号,数字前面的字母 a 表示第几块硬盘(也可能是可移动磁盘)
1 | $ df -h #查看主机磁盘的使用情况 |
使用du命令查看目录的容量
1 | # 默认同样以 blocks 的大小展示 |
-d
参数指定查看目录的深度1
2
3
4# 只查看1级目录的信息
$ du -h -d 0 ~
# 查看2级
$ du -h -d 1 ~
简单磁盘管理
dd命令简介
dd
命令用于转换和复制文件,不过它的复制不同于cp
。之前提到过关于 Linux 的很重要的一点,一切即文件,在 Linux 上,硬件的设备驱动(如硬盘)和特殊设备文件(如/dev/zero
和/dev/random
)都像普通文件一样,只要在各自的驱动程序中实现了对应的功能,dd 也可以读取自和/或写入到这些文件。这样,dd
也可以用在备份硬件的引导扇区、获取一定数量的随机数据或者空数据等任务中。dd
程序也可以在复制时处理数据,例如转换字节序、或在 ASCII 与 EBCDIC 编码间互换。
dd
的命令行语句与其他的 Linux 程序不同,因为它的命令行选项格式为选项=值
,而不是更标准的--选项 值
或-选项=值
。dd
默认从标准输入中读取,并写入到标准输出中,但可以用选项if
(input file,输入文件)和of
(output file,输出文件)改变。
我们先来试试用dd
命令从标准输入读入用户输入到标准输出或者一个文件:
1 | # 输出到文件 |
上述命令从标准输入设备读入用户输入(缺省值,所以可省略)然后输出到 test 文件,bs
(block size)用于指定块大小(缺省单位为 Byte,也可为其指定如’K’,’M’,’G’等单位),count
用于指定块数量。如上图所示,我指定只读取总共 10 个字节的数据,当我输入了“hello shiyanlou”之后加上空格回车总共 16 个字节(一个英文字符占一个字节)内容,显然超过了设定大小。使用和du
和cat
命令看到的写入完成文件实际内容确实只有 10 个字节(那个黑底百分号表示这里没有换行符),而其他的多余输入将被截取并保留在标准输入。 前面说到dd
在拷贝的同时还可以实现数据转换,那下面就举一个简单的例子:将输出的英文字符转换为大写再写入文件:
1 | $ dd if=/dev/stdin of=test bs=10 count=1 conv=ucase |
使用dd命令创建虚拟镜像文件
从/dev/zero
设备创建一个容量为 256M 的空文件:1
2$ dd if=/dev/zero of=virtual.img bs=1M count=256
$ du -h virtual.img
使用mkfs命令格式化磁盘
1 | $ sudo mkfs.ext4 virtual.img #虚拟磁盘镜像格式化为ext4文件系统 |
使用mount命令挂载磁盘到目录树
1 | $ sudo mount #查看主机已挂载的文件系统 |
mount命令的一般格式1
mount [-o [操作选项]] [-t 文件系统类型] [-w|--rw|--ro] [文件系统源] [挂载点]
常用操作1
mount [-o [操作选项]] [-t 文件系统类型] [-w|--rw|--ro] [文件系统源] [挂载点]
挂载到/mnt目录1
2
3
4
5
6$ mount -o loop -t ext4 virtual.img /mnt
# 也可以省略挂载类型,很多时候 mount 会自动识别
# 以只读方式挂载
$ mount -o loop --ro virtual.img /mnt
# 或者mount -o loop,ro virtual.img /mnt
在类 UNIX 系统中,/dev/loop(或称vnd (vnode disk)、lofi(循环文件接口))是一种伪设备,这种设备使得文件可以如同块设备一般被访问。在使用之前,循环设备必须与现存文件系统上的文件相关联。这种关联将提供给用户一个应用程序接口,接口将允许文件视为块特殊文件(参见设备文件系统)使用。因此,如果文件中包含一个完整的文件系统,那么这个文件就能如同磁盘设备一般被挂载。这种设备文件经常被用于光盘或是磁盘镜像。通过循环挂载来挂载包含文件系统的文件,便使处在这个文件系统中的文件得以被访问。这些文件将出现在挂载点目录。如果挂载目录中本身有文件,这些文件在挂载后将被禁止使用。
使用umount命令卸载已挂载磁盘
1 | # 命令格式 sudo umount 已挂载设备名或者挂载点,如: |
使用fdisk为磁盘分区
1 | # 查看硬盘分区表信息 |
输出结果中开头显示了主机上的磁盘的一些信息,包括容量扇区数,扇区大小,I/O 大小等信息。
/dev/sda1,/dev/sda2 为主分区分别安装了 Windows 和 Linux 操作系统,/dev/sda3 为交换分区(可以理解为虚拟内存),/dev/sda4 为扩展分区其中包含 /dev/sda5,/dev/sda6,/dev/sda7,/dev/sda8 四个逻辑分区,因为主机上有几个分区之间有空隙,没有对齐边界扇区,所以分区之间的不是完全连续的。
1 | # 进入磁盘分区模式 |
使用lostup命令建立镜像与回环设备的关联
1 | $ sudo losetup /dev/loop0 virtual.img |
然后再使用mkfs
格式化各分区(前面我们是格式化整个虚拟磁盘镜像文件或磁盘),不过格式化之前,我们还要为各分区建立虚拟设备的映射,用到kpartx
工具,需要先安装:
1 | $ sudo apt-get install kpartx |
![](https://dn-anything-about-doc.qbox.me/linux_base/7-15.png)
接着再是格式化,我们将其全部格式化为 ext4:
1 | $ sudo mkfs.ext4 -q /dev/mapper/loop0p1 |
格式化完成后在`/media`目录下新建四个空目录用于挂载虚拟磁盘:
1 | $ mkdir -p /media/virtualdisk_{1..3} |
1 | # 挂载磁盘分区 |
然后:
1 | $ df -h |
命令执行顺序控制与管道
命令执行顺序的控制
顺序执行多条命令
1 | $ sudo apt-get update |
1 | $ sudo apt-get update;sudo apt-get install some-tool;some-tool |
管道
管道是什么,管道是一种通信机制,通常用于进程间的通信(也可通过socket进行网络通信),它表现出来的形式就是将前面每一个进程的输出(stdout)直接作为下一个进程的输入(stdin)。管道又分为匿名管道和具名管道(这里将不会讨论在源程序中使用系统调用创建并使用管道的情况,它与命令行的管道在内核中实际都是采用相同的机制)。我们在使用一些过滤程序时经常会用到的就是匿名管道,在命令行中由|
分隔符表示,|
在前面的内容中我们已经多次使用到了。具名管道简单的说就是有名字的管道,通常只会在源程序中用到具名管道。下面我们就将通过一些常用的可以使用管道的”过滤程序”来帮助你熟练管道的使用。
1 | $ ls -al /etc | less #过管道将前一个命令(ls)的输出作为下一个命令(less)的输入 |
cut命令,打印每一行的某一个字段
打印/etc/passwd文件中以:为分隔符的第1个字段和第6个字段分别表示用户名和其家目录
1 | $ cut /etc/passwd -d ':' -f 1,6 |
打印/etc/passwd文件中每一行的前N个字符
1 | # 前五个(包含第五个) |
grep命令,在文本中或stdin中查找匹配字符串
grep命令的一般形式为:1
grep [命令选项]... 用于匹配的表达式 [文件]...
搜索/home/shiyanlou目录下所有包含”shiyanlou”的所有文本文件,并显示出现在文本中的行号1
$ grep -rnI "shiyanlou" ~ #-r 参数表示递归搜索子目录中的文件,-n表示打印匹配项行号,-I表示忽略二进制文件
1 | # 查看环境变量中以"yanlou"结尾的字符串 |
wc命令
wc 命令用于统计并输出一个文件中行、单词和字节的数目1
$ wc /etc/passwd
分别只输出行数、单词数、字节数、字符数和输入文本中最长一行的字节数1
2
3
4
5
6
7
8
9
10# 行数
$ wc -l /etc/passwd
# 单词数
$ wc -w /etc/passwd
# 字节数
$ wc -c /etc/passwd
# 字符数
$ wc -m /etc/passwd
# 最长行字节数
$ wc -L /etc/passwd
1 | $ ls -dl /etc/*/ | wc -l #结合管道来操作一下,统计 /etc 下面所有目录数 |
sort排序命令
1 | $ cat /etc/passswd | sort #默认为字典排序 |
-t参数用于指定字段的分隔符,这里是以”:”作为分隔符;-k 字段号用于指定对哪一个字段进行排序。这里/etc/passwd文件的第三个字段为数字,默认情况下是一字典序排序的,如果要按照数字排序就要加上-n参数
uniq去重命令
- 过滤重复行
1 | | | | uniq |
- 输出重复行
1 | # 输出重复过的行(重复的只输出一个)及重复次数 |
简单的文本处理
文本处理命令
tr 命令
tr 命令可以用来删除一段文本信息中的某些文字。或者将其进行转换。
选项 | 说明 |
---|---|
-d | 删除和set1匹配的字符,注意不是全词匹配也不是按字符顺序匹配 |
-s | 去除set1指定的在输入文本中连续并重复的字符 |
1 | # 删除 "hello shiyanlou" 中所有的'o','l','h' |
col 命令
col 命令可以将Tab换成对等数量的空格建,或反转这个操作。
选项 | 说明 |
---|---|
-x | 将Tab转换为空格 |
-h | 将空格转换为Tab(默认选项) |
1 | # 查看 /etc/protocols 中的不可见字符,可以看到很多 ^I ,这其实就是 Tab 转义成可见字符的符号 |
join 命令
将两个文件中包含相同内容的那一行合并在一起
选项 | 说明 |
---|---|
-t | 指定分隔符,默认为空格 |
-i | 忽略大小写的差异 |
-1 | 指明第一个文件要用哪个字段来对比,,默认对比第一个字段 |
-2 | 指明第二个文件要用哪个字段来对比,,默认对比第一个字段 |
1 | # 创建两个文件 |
paste命令
在不对比数据的情况下,简单地将多个文件合并一起,以Tab隔开
选项 | 说明 |
---|---|
-d | 指定合并的分隔符,默认为Tab |
-s | 不合并到一行,每个文件为一行 |
1 | $ echo hello > file1 |
Linux下软件安装
linxu上的软件安装
通常Linux上的软件安装主要有三种方式:
- 在线安装
- 从磁盘安装deb软件包
- 从二进制软件包安装
- 从源代码编译安装
在线安装
1 | $ sudo apt-get install tools |
apt-get包含的常用的一些工具
工具 | 说明 |
---|---|
install | 其后加上软件包名,用于安装一个软件包 |
update | 从软件源镜像服务器上下载/更新用于更新本地软件源的软件包列表 |
upgrade | 升级本地可更新的全部软件包,但存在依赖问题时将不会升级,通常会在更新之前执行一次update |
dist-upgrade | 解决依赖关系并升级(存在一定危险性) |
remove | 移除已安装的软件包,包括与被移除软件包有依赖关系的软件包,但不包含软件包的配置文件 |
autoremove | 移除之前被其他软件包依赖,但现在不再被使用的软件包 |
purge | 与remove相同,但会完全移除软件包,包含其配置文件 |
clean | 移除下载到本地的已经安装的软件包,默认保存在/var/cache/apt/archives/ |
autoclean | 移除已安装的软件的旧版本软件包 |
apt-get常用的参数
参数 | 说明 |
---|---|
-y | 自动回应是否安装软件包的选项,在一些自动化安装脚本中使用这个参数将十分有用 |
-s | 模拟安装 |
-q | 静默安装方式,指定多个q或者-q=#,#表示数字,用于设定静默级别,这在你不想要在安装软件包时屏幕输出过多时很有用 |
-f | 修复损坏的依赖关系 |
-d | 只下载不安装 |
–reinstall | 重新安装已经安装但可能存在问题的软件包 |
–install-suggests | 同时安装APT给出的建议安装的软件包 |
安装软件
1 | $ sudo apt-get --reinstall install <软件包名> |
软件升级
1 | # 更新软件源 |
卸载软件
1 | sudo apt-get remove w3m |
1 | # 不保留配置文件的移除 |
软件搜索
1 | sudo apt-cache search softname1 softname2 softname3…… |