linux基础
本文基于centos7.1的系统
一、目录操作
linux文件系统只有一棵目录树,就是根分区(/)。linux大体的目录树结构如下
bin: 该目录中存放Linux的常用命令
dev: 该目录包含了Linux系统中使用的所有外部设备,它实际上是访问这些外部设备的端口,访问这些外部设备与访问一个文件或一个目录没有区别
etc: 该目录存放系统管理时要用到的各种配置文件和子目录,例如网络配置文件、文件系统、X系统配置文件、设备配置信息、设置用户信息等
sbin: 该目录用来存放系统管理员使用的管理程序
var: 该目录存放那些经常被修改的文件,包括各种日志、数据文件
usr: 用户的应用程序和文件几乎都存放在该目录下
home: 用户的家目录
lib:该目录用来存放系统动态链接共享库,几乎所有的应用程序都会用到该目录下的共享库
tmp:用来存放不同程序执行时产生的临时文件,该目录会被系统自动清理干净
这里做一点简单的归纳
- 系统级的组件放在/bin、/lib;
- 根用户才能访问的放在/sbin;
- 系统repository提供的应用程序放在/usr/bin、/usr/lib;
- 用户自己编译的放在/usr/local/XXX。
也可以这样理解:重要的二进制位于 /bin(用户二进制)以及 /sbin(系统二进制)中。不重要的二进制(如图形环境或Office 工具)安装在/usr/bin 和 /usr/sbin中。进行这种分隔是为了尽可能地缩小根分区。使用源代码编译的软件通常位于 /usr/local/bin 和/usr/local/sbin中。
注:现如今大多数linux系统已经把/bin,/sbin,/lib,/lib64做成了/usr/bin,/usr/sbin,/usr/lib,/usr/lib64的符号链接,所以我们在以后的学习中可以不加以区分。
目录结构具体可参考http://www.centoscn.com/CentOS/help/2015/0424/5262.html
简单的目录操作命令
- pwd ---- 查看当前目录
- cd dirname ----- 切换目录,dirname有绝对路径和相对路径之分,其中.表示当前目录(可以用来构造下一级目录),..表示上一级目录,- 表示上一次目录。注:.和..只是提供目录跳转的符号,并不是一个文件或者目录
- ll -ha | less ----- 查看目录内容,'q'退出
- mkdir ----- 创建目录(可以同时创建多个目录),-p选项是递归创建目录,-m设置目录权限
- rmdir ----- 删除空目录(可以同时删除多个目录),一般不用,因为rm命令可以做到rmdir能做到的,也能做到rmdir做不到的
注意:默认的umask是022,也就是说创建目录默认权限是755,文件权限是644(去掉可执行权限1)。umask命令可以查看当前的umask值,我们也可以修改/etc/profile的umask值
二、文件操作
linux的核心思想是一切皆文件,区别于windows的一点是不是以后缀名区分文件类型,可以用file命令查看文件类型
注:file查看的文件类型是根据你写入的内容自动确定的
linux把文件分为7类:目录(d)、普通文件(-)、链接文件(l)、块设备(b)、字符设备(c)、套接字(s)以及管道(p)
ls -l 查看当前目录文件的时候有一项是文件最后修改或访问的时间,这可能是我们以后需要常关注的内容
注意:上图的4k是文件夹本身的大小,不包括文件夹里面的文件的总大小,想要查看目录包含文件的总大小用du -sh dirname命令;linux的文件名和目录不能同名,同名的话cd就不知道该访问文件还是目录
简单的文件操作命令
touch filename # 更改text的时间戳,若无text则创建text
> filename # 无符号重定向,创建空文件
rm filename # 删除文件 -r 递归删除 -f 强制删除,不显示提示信息
mv A B # 把文件或者目录A移动到B,分为以下几种情况:A是文件或者目录,B不存在,则重名A为B;A是文件或者目录,B是目录,把A移动到B内;A是文件或者目录,B是文件,则提示是否覆盖
可以用-f参数直接不显示提示信息直接覆盖(可以同时把多个文件或者目录移动到最后一个目录)
cp A B # -a 把A的所有特性一并复制 -r/-R/--recursively参数用来复制目录,若B不存在会自动创建
vim file # a/A(append) i/I(insert) o/O(换行)
vim是一个比较强大的编辑器,具体使用可以参考http://www.cnblogs.com/dengmj/p/5031498.html
数据流
在linux中,几乎所有的命令都可以看作是一个程序。既然是程序,那么就应该有数据输入与输出,数据输入一般是通过标准输入输入的,数据输出一般输出到标准输出。所谓的标准输入与标准输出指的是程序的默认输入与默认输入,分别指的是键盘和显示屏,当然我们也可以根据自己的需要更改默认输入与默认输出。例如input() 默认找系统的stdin,而stdin又是默认连接到键盘。
注:数据流不是全部直接流入到屏幕,而是先暂存在缓冲区,然后再一次性丢给屏幕。
在这里,我们要区分从参数获得输入和从标准输入获得输入。从参数获得输入就是把参数给shell,然后由shell提交给命令。
echo # 回显,可以接受标准输入,也可以接收命令参数,甚至可以用拓展技术进行模式匹配
输出重定向:>(不断刷新) >>(追加)
管道数据流模型:用于把一个程序的输出交给另外一个程序的输入
python一般接收一个文件,把文件代码作为输入,但这里是直接把代码作为输入。
详解cat
- 拼接输出 :接收输入,把输入的内容显示。输入既可以是文件列表,也可以是标准输入
- 拼接文件:结合重定向
要想实现把内容同时输出到屏幕(标准输出)和文件,可以采用tee命令
信息展示
我们把ll的结果利用管道交给grep,并当作grep的最后一个参数,这时grep参数就不需要指定最后一个参数。
模式匹配是匹配文件名包含python的内容
less: -e 当文件显示结束后,自动离开; -N 显示每行的行号; -s 显示连续空行为一行; /字符串:向下搜索“字符串”的功能; ?字符串:向上搜索“字符串”的功能;
b 向后翻一页, d 向后翻半页, h 显示帮助界面, Q 退出less 命令, u 向前滚动半页, y 向前滚动一行, 空格键 滚动一行, 回车键 滚动一页, [pagedown]: 向下翻动一页, [pageup]: 向上翻动一页
more: +n 从第n行开始显示; -n 定义屏幕大小为n行; -s 把连续的多个空行显示为一行; +/pattern 在每个档案显示前搜寻该字串(pattern),然后从该字串前两行之后开始显示。
注:less is more, 在以后的学习过程中我们常常用less
查找文件
简单易用:updatedb + locate
稍微复杂:find
注意一点:一个文件的名字其实除了文件名本身外,其实还包括了它的路径。如果仅仅是文件名,则表示的是相对路径
find 目录(默认当前目录) -test content
注:content不和通配符混合使用只能精确匹配
test的类型如下:-name -type -size(M或者G是大写)
操作符:-and/-a(默认) -or/-o -not/-!
链接
软连接(-s) # 相当于windows底下的快捷方式
删除软连接
软连接分为相对连接与绝对连接。相对连接不在乎连接的是什么,只是在乎连接的文件或目录的名称以及与软连接的相对位置。
硬连接 # 相当于python中的对象引用(不要随便建立硬连接,因为修改其中一个就会修改对象内容)。去掉软连接的-s选项就是硬连接
任务和进程
jobs 命令查看当前后台运行的任务
两个快捷键(针对于前台程序):crtl + z(暂停程序) crtl + c(终止程序)
暂停程序后可以进行的操作:fg %num 把程序调度到前台运行;bg %num 把程序调度到后台运行(python server.py & 把程序放到后台运行)。(num 是查看jobs得出来的值)
注:不要把有标准输出的程序放到后台运行,这样你的shell可能会和程序的输出混合到一起,但是两者互不影响;只有前台程序才能crtl + c 终止程序
进程例子:ps -ef|grep mysql|grep -v 'grep' 得出来的结果的第二列是进程号,可以用kill命令删除;关掉主进程,守护线程也跟着关掉
时间
查看当前系统时间:date
查看当前系统时区:date -R
调整当前系统时区:1、tzselect 2、cp /usr/share/zoneinfo/$主时区/$次时区 /etc/localtime 例如 cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
设置当前系统时间:例如:将系统日期设定成2009年11月3日的命令 命令 : "date -s 11/03/2009";将系统时间设定成下午5点55分55秒的命令 命令 : "date -s 17:55:55"
注:上述设置时间只是临时的,重启后即失效,要想永久设置时间可以用下面命令:hwclock -w
别名
在linux系统中经常碰到很长的命令。我们又很难记住,或者觉得打那么多字麻烦,或者我们为了使我们经常要进行的某个操作方便快捷,那么我们可以可以把这些命令组合起来,给它指定一个别名,这样我们只要执行这个“别名”命令的时候,就相当于执行了之前的那个命令了,非常的方便。
查看系统已有别名:alias
临时更改别名:例如alias cdmydir='cd /root/mydir'
取消别名:unalias cdmydir
永久更改别名:直接使用alias命令定义的别名,重启后就会失效。因此如果需要永久使用别名,就需要做一些操作。修改/定义别名,实际上也是在定义系统的环境变量。系统环境变量文件是/etc/profile。
但是查看profile文件,你会发现文件最开头就有提示:
因此最好不要直接在/etc/profile文件出进行定义,而是在/etc/bashrc中进行定义,定义完成后,通过 #source /etc/bashrc使其生效。
或者,重新定义一个文件 /etc/profile.d/alias_bash.sh (alias_bash文件名是任意取的),然后通过 #source /etc/profile.d/alias_bash使其生效。再或者修改root目录下的.bashrc文件
通过这些方法,就可以使自己(自定义)的别名永久生效了。
端口
linux如何查看端口被哪个进程占用的方法:1、lsof -i:端口号 2、netstat -tunlp|grep 端口号
lsof -i 用以显示符合条件的进程情况,lsof(list open files)是一个列出当前系统打开文件的工具
netstat -tunlp用于显示tcp,udp的端口和进程等相关情况,配合grep进行过滤
查看服务占用端口情况,命令是netstat -apn|grep Patern
3306是占用端口,20973是PID
注: grep的参数是模糊匹配 ps aux|grep mysql 和 ps aux|grep mysq结果一样哦(因为grep是模糊匹配)
统计当前目录下的文件个数、目录个数
有时候我们不关心目录下的文件是什么,只关心目录下的文件个数。例如我们想要查看/bin目录下的命令总数,这时候我们就要用到下面的知识了。
- 统计当前文件夹下文件的个数 ls -l |grep "^-"|wc -l
- 统计当前文件夹下目录的个数 ls -l |grep "^d"|wc -l
- 统计当前文件夹下文件的个数,包括子文件夹里的 ls -lR|grep "^-"|wc -l 注意:-R 在这里表示recursive, -r表示reverse
- 统计文件夹下目录的个数,包括子文件夹里的 ls -lR|grep "^d"|wc -l
注:ls的参数-l 必须和wc的参数-l 相对应,因为wc的-l 参数表示统计行数