Linux基础一
1. Linux基本原则
- 由目的单一的小程序组成,组合小程序完成复杂任务;
- 一切皆文件;
- 配置文件保存为纯文本格式。
2. bash特性
2.1 shell
shell(外壳),广义的shell可以理解为是用户的工作环境,在windows看来桌面就是一个shell,在linux看来终端就是shell
常见的shell有两种,一种是图形界面,即GUI,一种是命令行终端,即CLI。
常用的GUI:Graphic User Interface
- Windows
- X-Window
- Gnome
- KDE
- Xface
常用的CLI:Command Line Interface
- bash
- sh
- csh
- zsh
- ksh
- tcsh
2.2 bash特性
bash支持以下特性:
- 支持命令历史、命令补全
- 支持管道、重定向
- 支持命令别名
- 支持命令行编辑
- 支持命令行展开
- 支持文件名通配
- 支持变量
- 支持编程
2.2.1 bash支持的引号
`` //反引号,键盘左上角Esc下面的键,用于命令替换
"" //双引号,弱引用,可以实现变量替换
'' //单引号,强引用,不完成变量替换
2.2.2 bash常用操作
//光标跳转
Ctrl+a //跳到命令行首
Ctrl+e //跳到命令行尾
Ctrl+u //删除光标至命令行首的内容
Ctrl+k //删除光标至命令行尾的内容
Ctrl+<-- //光标定位到离自己最近的一个单词前面
Ctrl+l //清屏
//命令历史
history //查看命令历史
-c //清空命令历史
-d OFFSET [n] //删除指定位置的命令历史
-w //保存命令历史至历史文件~/.bash_history中
//命令历史的使用技巧
!n //执行命令历史中的第n条命令
!-n //执行命令历史中倒数第n条命令
!! //执行上一条命令
!string //执行命令历史中最近一个以指定字符串开头的命令
!$ //引用前一个命令的最后一个参数
esc,. //按下esc松开后按.,引用前一个命令的最后一个参数
//命令补全
搜索PATH环境变量所指定的每个路径下以我们给出的字符串开头的可执行文件, \
如果多于一个,两次tab,可以给出列表,否则将直接补全
//路径补全
搜索我们给出的起始路径下的每个文件名,并试图补全
//命令别名:
alias CMDALIAS='COMMAND [options] [arguments]'
在shell中定义的别名仅在当前shell生命周期中有效,别名的有效范围为当前的shell进程。
//命令替换(把命令中某个子命令替换为其执行结果的过程)
$(COMMAND) //推荐方式
或
`COMMAND`
//命令行展开
~ //展开为用户的家目录
~USERNAME //展开为指定用户的家目录
{} //可承载一个以逗号分隔的列表,并将其展开为多个路径
/tmp/{a,b} = /tmp/a, /tmp/b
/tmp/{tom,jerry}/hi = /tmp/tom/hi, /tmp/jerry/hi
//文件名通配 globbing
* //匹配任意长度的任意字符
? //匹配任意单个字符
[] //匹配指定范围内的任意单个字符
[abc],[a-m],[0-9]
[[:space:]] //表示空白字符
[[:punct:]] //表示标点符号
[[:lower:]] //表示小写字母
[[:upper:]] //表示大写字母
[[:alpha:]] //表示大小写字母
[[:digit:]] //表示数字
[[:alnum:]] //表示数字和大小写字母
使用man 7 glob命令可以获得以上字符集合的帮助信息!!!
[^] //匹配指定范围之外的任意单个字符
//环境变量
PATH //命令搜索路径
HISTSIZE //命令历史缓冲区大小
SHELL //当前shell
//bash内置变量
RANDOM //保存着0-32768之间的随机数
3. 命令
3.1 命令格式
命令 [选项] [参数]
选项:(可以有0个或多个)
短选项:-
多个选项可以组合: -a -b = -ab
长选项:--
长选项通常不能组合
参数:命令的作用对象(可以有0个或多个)
3.2 命令类型
Linux命令分为两种类型:
- 内部命令(shell内置)
- 外部命令:在文件系统的某个路径下有一个与命令名称相应的可执行文件
type //显示指定命令属于哪种类型
3.3 基础命令
//目录管理
ls //列出目录内容
-l //长格式
文件类型
- //普通文件(f)
d //目录文件
b //块设备文件(block)
c //字符设备文件(character)
l //符号链接文件(symbolic link file)
p //命令管道(pipe)
s //套接字文件(socket)
文件权限 //9位,每3位一组,每一组:rwx(读,写,执行)
文件硬链接的次数
文件的属主(owner)
文件的属组(group)
文件大小(size),单位是字节
时间戳(timestamp),最近一次被修改的时间
访问 //access
修改 //modify,文件内容发生改变
改变 //change,metadata(元数据)
-h //做单位转换
-a //显示以.开头的隐藏文件
. //表示当前目录
.. //表示父目录
-d //显示目录自身属性
-i //显示文件的inode(index node)
-r //逆序显示
-R //递归(recursive)显示
cd //改变当前工作目录
pwd //打印当前工作目录路径
mkdir //创建目录
-p //创建目录时若父目录不存在则自动创建
-v //显示目录创建过程
rmdir //删除目录,只能删除空目录
tree //查看目录树
//文件管理
touch //无中生有、万象更新
stat //显示文件或文件系统的状态
rm //删除文件,删除命令默认会提示是否需要删除, \
//如果要使用命令本身可以在命令前加一个\,如\rm,这样删除就不会有提示了
-r //递归删除,删除目录时必须使用此选项
-f //强制删除,不询问
cp //复制文件,一个文件到一个文件,多个文件到一个目录
-a //归档复制,常用于备份
-r //递归拷贝,拷贝目录时必须使用此选项
-p //拷贝时保留原权限
mv //移动文件
install //复制文件并且设置属性
-m MODE
-o OWNER
-g GROUP
//压缩、解压缩命令
//压缩格式
gz,bz2,xz,zip,Z
gzip //压缩后的文件以.gz结尾
gzip /path/to/somefile //压缩完成后会删除原文件
-d //解压缩,解压完成后会删除原文件
-c //将结果输出至标准输出
-# //#用1-9代替,指定压缩比,默认为6
gunzip //解压
gunzip /path/to/some_compress_file.gz //解压完成后会删除原文件
zcat /path/to/somefile.gz //不解压的情况下查看文本文件的内容
bzip2 //压缩后的文件以.bz2结尾
//bzip2是一款比gzip有着更大压缩比的压缩工具,使用格式近似
bzip2 /path/to/somefile //压缩完成后会删除原文件
-d //解压缩,解压完成后会删除原文件
-# //#用1-9代替,指定压缩比,默认为6
-k //keep,压缩时保留原文件
bunzip2 //解压
bunzip2 /path/to/some_compress_file.bz2 //解压完成后会删除原文件
bzcat /path/to/somefile.bz2 //不解压的情况下查看文本文件的内容
xz //压缩后的文件以.xz结尾
//比bzip2有着更大压缩比的压缩工具,使用格式近似
xz /path/to/somefile //压缩完成后会删除原文件
-d //解压缩,解压完成后会删除原文件
-# //#用1-9代替,指定压缩比,默认为6
-k //keep,压缩时保留原文件
unxz //解压
unxz /path/to/some_compress_file.xz //解压完成后会删除原文件
xzcat /path/to/somefile.xz //不解压的情况下查看文本文件的内容
zip //既归档又压缩的工具。zip可以压缩目录,\
//gz、bz2、xz都只能压缩文件,zip压缩后不会删除原文件
zip filename.zip file1 file2 ...
zip filename.zip DIR/*
unzip
unzip filename.zip
archive //归档,归档本身并不意味着压缩
tar //归档工具,只归档不压缩
-c //创建归档文件
-f file.tar //操作的归档文件
-x //还原归档
-v //显示归档过程
-p //归档时保留权限信息。只有管理员才有权限用此选项
-C //将展开的归档文件保存至指定目录下
--delete //从归档文件中删除文件
--xattrs //在归档时保留文件的扩展属性信息
-tf /path/to/file.tar //不展开归档,直接查看归档了哪些文件
-zcf //归档并调用gzip压缩
-zxf //调用gzip解压缩并展开归档
-jcf //归档并调用bzip2压缩
-jxf //调用bzip2解压缩并展开归档
-Jcf //归档并调用xz压缩
-Jxf //调用xz解压缩并展开归档
//查看文本
cat //拼接文件内容并输出至标准输出(屏幕)
-n //显示行号
//使用cat查看文件内容时会将文件的所有内容加载至内存, \
//所以应避免使用cat打开巨大文件
more //全屏查看文本文件内容,只能从前往后,不能从后往前。\
//文件内容显示完后自动退出
less //全屏查看文本文件内容,可从前往后亦可从后往前。推荐使用
head //从头部开始打印文件内容,默认打印10行
-n //指定要打印的行数,可以是-n 15也可以是-15
tail //查看文本文件尾部内容
-n //指定要打印的行数,可以是-n 15也可以是-15
//文本处理
cut //截取文本内容
-d //指定字段分隔符,默认是空格
-f //指定要显示的字段
-f 1,3 显示1和3
-f 1-3 显示1到3
sed //基于行的过滤和转换文本的流编辑器
awk //基于列的文本报告工具
//文本排序
sort //默认升序排序,不是按数值大小排序的
-n //根据数值大小进行排序
-r //逆序排序
-t //字段分隔符
-k //以哪个字段为关键字进行排序
-u //去重,排序后相同的行只显示一次
-f //排序时忽略字符大小写
uniq //报告重复的行(连续且完全相同方为重复)
-c //显示文件中行重复的次数
-d //只显示重复的行
-u //只显示未重复的行
//文本统计
wc(word count)
-c //显示字节数
-l //显示行数
-w //显示单词数
//大小统计
du //查看文件或目录占用的磁盘空间大小
-h //以人类友好的方式显示大小
-s //显示总的占用空间大小
df //报告文件系统磁盘空间使用情况
-h //以人类友好的方式显示大小
-i //显示inode信息
//主机名管理
hostname //查看或临时修改主机名,重开终端有效,重启失效
hostnamectl //查看或永久修改主机名,重开终端生效,重启依然有效
//其它
time //显示命令的执行时间,例如time ls /etc
clear //清屏
whoami //显示当前登录用户
w //显示当前在线用户并显示其在运行的命令
who //查看当前在线用户
which //显示指定命令的绝对路径
date //显示或设置日期与时间
//不带参数的date用于显示当前系统日期与时间
-s //以字符串方式设置时间
//格式化输出时间:+
%Y //年
%m //月
%d //日
%H //时
%M //分
%S //秒
ldd //查看指定程序有哪些依赖库文件
程序组成?
二进制程序
库文件
配置文件
帮助文件
3.4 如何获取命令帮助
//内部命令
help COMMAND
//外部命令
COMMAND --help
//在线文档
info COMMAND
//命令手册 manual
man COMMAND
//文档
/usr/share/doc
whatis COMMAND //用于查看COMMAND出现在man的哪一章节中。
//man是分章节的,以下是每一章节的内容介绍:
1 用户命令(/bin,/usr/bin,/usr/local/bin);
2 系统调用;
3 库调用;
4 特殊文件(设备文件);
5 文件格式(配置文件 的语法);
6 游戏;
7 杂项(Miscellaneous);
8 管理命令(/sbin,/usr/sbin,/usr/local/sbin)
//man手册注意事项:
[] //可选
<> //必选
... //可以出现多次
| //多选一
{} //分组
NAME //命令名称及功能简要说明
SYNOPSIS //用法说明,包括可用的选项
DESCRIPTION //命令功能的详尽说明,可能包括每一个选项的意义
OPTIONS //说明每一个选项的意义
FILES //此命令相关的配置文件
BUGS //报告bug
EXAMPLES //使用示例
SEE ALSO //另外参照
//man翻屏
向后翻一屏 //SPACE
向前翻一屏 //b
向后翻一行 //enter
向前翻一行 //k
//查找
/KEYWORD //向后
?KEYWORD //向前
n //下一个
N //前一个
q //退出
Linux基础二
4. 文件命名规则
- 长度不能超过255个字符;
- 不能使用/当文件名;
- 严格区分大小写
5. Linux常用命令(续)
//文本查找 grep egrep fgrep
grep //根据模式搜索文本,并将符合模式的文本行显示出来。 \
//使用基本正则表达式定义的模式来过滤文本的命令。
Pattern(模式) //文本字符和正则表达式的元字符组合而成的匹配条件
-i //忽略大小写
--color //匹配到的内容高亮显示
-v //显示没有被模式匹配到的行
-o //只显示被模式匹配到的字符串
-E //使用扩展正则表达式。grep -E相当于使用egrep
-q //静默模式,不输出任何信息
-A 1 //被模式匹配到的内容以及其后面一行的内容都显示出来,\
//如果把1改成2就表示被模式匹配到的内容以及其后面2行的内容均显示出来
-B 1 //被模式匹配到的内容以及其前面一行的内容都显示出来, \
//如果把1改成2就表示被模式匹配到的内容以及其前面2行的内容均显示出来
-C 1 //被模式匹配到的内容以及其前后的行各显示1行,如果把1改成2 \
//就表示被模式匹配到的内容以及其前后的行各显示2行。
fgrep //不支持正则表达式,执行速度快
//文件查找
在文件系统上查找符合条件的文件
locate
//语法:
locate KEYWORD
//非实时,模糊匹配,查找是根据全系统文件数据库进行的,查找的速度快
//依赖于事先构建的索引。索引的构建是在系统较为空闲时自动进行(周期性任务)
updatedb //手动生成文件数据库
//索引构建过程需要遍历整个根文件系统,极消耗资源
find //实时查找,精确性强,遍历指定目录中所有文件完成查找, \
//查找速度慢,支持众多查找标准。
//语法:find [OPTION...] 查找路径 查找标准 查找到以后的处理动作
查找路径 //默认为当前目录
查找标准 //默认为指定路径下的所有文件
-name 'filename' //对文件名作精确匹配.支持glob通配符机制
-iname 'filename' //文件名匹配时不区分大小写
-regex pattern //基于正则表达式进行文件名匹配.以pattern \
//匹配整个文件路径字符串,而不仅仅是文件名称
-user username //根本属主来查找
-group groupname //根据属组来查找
-uid //根据UID进行查找,当用户被删除以后文件的属主会变为此用户的UID
-gid //根据GID进行查找,当用户被删除以后文件的属组会变为此用户的GID
-nouser //查找没有属主的文件.用户被删除的情况下产生的文件,只有uid没有属主
-nogroup //查找没有属组的文件.组被删除的情况下产生的文件,只有gid没有属组
-type //根据文件类型来查找(f,d,c,b,l,p,s)
-size //根据文件大小进行查找。如1k、1M,+10k、+10M,-1k、-1M, \
//+表示大于,-表示小于
[+|-]
#K、#M、#G
#Unit表示(从#-1到#之间的范围大小)
-#Unit表示(从0到#-1的范围大小)
+#Unit表示(大于#的所有)
-mtime //修改时间
-ctime //改变时间
-atime //访问时间
+5 //5天前
-5 //5天以内
-mmin //多少分钟修改过
-cmin //多少分钟改变过
-amin //多少分钟访问过
+5 //5分钟前
-5 //5分钟以内
-perm mode //根据权限精确查找
-perm -mode //文件权限能完全包含此mode时才符合条件
-perm /mode //9位权限中有任何一位权限匹配都视为符合查找条件
//组合条件:
-a
-o
-not
!
例:
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
//处理动作:默认为显示到屏幕上
-print //显示
-ls //类似ls -l的形式显示每一个文件的详细信息
-delete //删除查找到的文件
-fls /path/to/somefile //查找到的所有文件的长格式信息保存至指定文件中
-ok COMMAND {} \; //对查找到的每个文件执行COMMAND,每次操作都需要用户确认
-exec COMMAND {} \; //对查找到的每个文件执行COMMAND,操作不需要确认
//注意:find传递查找到的文件至后面指定的命令时,查找到所有 \
//符合条件的文件一次性传递给后面的命令,而有些命令不能接受过多参数, \
//此时命令执行可能会失败。而xargs可规避此问题。
xargs //通过管道将查找到的内容给xargs处理,xargs后面直接跟命令即可
6. 文件层级系统
FHS //文件层级系统
/ //可以单独分区,LVM分区
/boot //系统启动相关的文件,如内核(vmlinuz)、initrd(initramfs),\
//以及grub(bootloader)。建议单独分区,基本分区
/dev //设备文件。不能单独分区
设备文件 //关联至一个设备驱动程序,进而能够与之对应硬件设备进行通信
块设备 //随机访问,数据块(比如硬盘)
字符设备 //也叫线性设备,线性访问,按字符为单位(比如鼠标、显示器)
设备号 //主设备号(major)和次设备号(minor)
主设备号标识设备类型
次设备号标识同一类型下的不同设备
设备文件只有元数据,没有数据
/etc //配置文件
/home //普通用户的家目录,每一个用户的家目录通常默认为/home/USERNAME。 \
//建议单独分区
/root //管理员的家目录。不该单独分区
/lib //库文件
静态库 //.a
动态库 //.dll,.so(shared object)
/lib/modules //内核模块文件
/media //挂载点目录,通常用来挂载移动设备
/mnt //挂载点目录,通常用来挂载额外的临时文件系统,比如另一块硬盘
/opt //可选目录,早期通常用来安装第三方程序
/proc //伪文件系统,内核映射文件(伪文件系统实际上里面是没有任何内容的, \
//开机之后才映射上去的)。不能单独分区
/sys //伪文件系统,跟硬件设备相关的属性映射文件(伪文件系统实际上里面是没有 \
//任何内容的,开机之后才映射上去的)。不能单独分区
/tmp //临时文件,/var/tmp
/var //可变化的文件,比如log、cache。存放日志信息、pid文件、lock文件,\
//建议单独分区
/bin //可执行文件,用户命令
/sbin //管理命令
/usr //shared,read-only,全局共享只读文件。提供操作系统核心功能,可以单独分区
/usr/bin
/usr/sbin
/usr/lib
/usr/local //第三方软件安装路径
/usr/local/bin
/usr/local/sbin
/usr/local/lib
/usr/local/etc
/usr/local/man
/etc,/bin,/sbin,/lib内是系统启动就需要用到的程序,这些目录不能挂载额外的分区,\
必须在根文件系统的分区上
/usr/bin,/usr/sbin,/usr/lib提供操作系统核心功能,/usr可以单独分区
/usr/local/bin,/usr/local/sbin,/usr/local/lib,/usr/local/etc, \
/usr/local/man等等在/usr/local目录下的内容都是第三方软件,建议单独分区
7. 重定向与管道
//系统设定:
默认输入设备 //标准输入,STDIN,0 (键盘)
默认输出设备 //标准输出,STDOUT,1 (显示器)
标准错误输出 //STDERR,2 (显示器)
//I/O重定向:
>:覆盖输出
>>:追加输出
2> //重定向错误输出
2>> //追加重定向错误输出
&> //覆盖重定向标准输出或错误输出至同一个文件
&>> //追加重定向标准输出或错误输出至同一个文件
< //输入重定向
<< //Here Document
管道 //前一个命令的输出,作为后一个命令的输入。最后一个命令会在当前shell进程 \
//的子shell进程中执行
命令1 | 命令2 | 命令3 | ...
tee //从标准输入读取数据,输出一份到屏幕上,一份保存到文件
[root@localhost ~]# echo "hello world" | tee /tmp/hello.out
hello world
[root@localhost ~]# cat /tmp/hello.out
hello world
8. bash字符串处理
//bash特性之截取变量的字符串
FILE=/usr/local/src
echo ${FILE#*/} 结果为 usr/local/src
echo ${FILE##*/} 结果为 src
echo ${FILE%/*} 结果为 /usr/local
//字符串切片
${var:offset:number}
//取字符串的最右侧几个字符(自右向左取)
${var: -lengh}
//注意:冒号后必须有一空白字符
//查找替换
${var/pattern/substi} //查找var所表示的字符串中,第一次被pattern所匹配到字符串,以substi替换之
${var//pattern/substi} //查找var所表示的字符串中,所有能被pattern所匹配到字符串,以substi替换之
${var/#pattern/substi} //查找var所表示的字符串中,行首被pattern所匹配到字符串,以substi替换之
${var/%pattern/substi} //查找var所表示的字符串中,行尾被pattern所匹配到字符串,以substi替换之
//查找并删除
${var/pattern} //查找var所表示的字符串中,第一次被pattern所匹配到字符串,删除之
${var//pattern} //查找var所表示的字符串中,所有被pattern所匹配到字符串,删除之
${var/#pattern} //查找var所表示的字符串中,行首被pattern所匹配到字符串,删除之
${var/%pattern} //查找var所表示的字符串中,行尾被pattern所匹配到字符串,删除之
//字符大小写转换
${var^^} //所有小写转换成大写
${var,,} //所有大写转换成小写
//注意:这里使用的是两个逗号“,,”