根据慕课网 Linux Guide for Developers和菜鸟课程笔记,主要是Linux知识的概述,看完主要能对Linux基本操作有个概念。
我们对于Linux到底要掌握多少知识呢?
我觉得你只要弄清楚基本文件操作,权限管理,进程管理,网络管理,linux的环境相关,vim的使用,软件包安装的使用应该就可以满足你日常的开发了。如果你是做后端开发,那么除了在以上我觉得你还要会一些服务,比如iptables,lamp,nginx,我觉得深入学习下web模型会比较好,比如弄清楚nginx 哪里比apache好,了解下什么是代理,有哪些缓存软件,dns,还有数据库,常用的脚本工具,如fabric ,supervisor 等等,如果你是做后端开发应该比我懂,因为这些软件都是围绕web和app来的。有时间就多了解下,部署的时候也能用到的。
1.概述
- 终端配置
- 用户权限
- 重定向
- 软件安装
- 搜索
- 进程
- 网络操作
- 脚本
2.终端配置
Linux命令行里面提示符:
终端使用手册查看命令行使用方法:
man 命令行
# 例子
man rm
3.文件系统
cd .. 返回上一级目录
cd ~ 或者 cd 返回用户家(根)目录
cd - 返回根目录之后,想返回之前的目录,可以用这个命令
cd ../ .. 返回上上级目录
cd /xx/xx (例如cd /yangyang/home)以绝对路径方式切换到指定文件夹
pwd 打印当前所在文件位置
Linux挂载分区解析图:
Linux绝对路径和相对路径:
绝对路径 start with “/”
相对路径 start with “.”or”..”
附注:/root是叫根目录,但是真正的根目录是/root和/home上面的文件夹../..,这才是根目录。
4.操作文件和目录
文件和文件夹的基础操作:
touch a.txt 创建文件
mkdir test 创建文件夹
echo hello >a.txt 写入数据到文件
vim a.txt 编辑文件
cat a.txt 查看文件
less a.txt 查看文件(分页查看)
file a.txt 查看文件类型
rm a.txt 删除文件
rm -r test 删除文件夹
cp file1 file2 复制文件或目录
mv file1 file2 移动或者重命名文件
文件的解压与打包:
uzip zip
# .tar.gz格式 的解压缩与压缩
tar -zxvf
tar -zcvf
# .tar.bz2格式 的解压缩与压缩
tar -jxvf
tar -jcvf
文件操作:
# 下载网页文件(下载的文件是index.html)
wget http://imooc.com
# less 分页查看文件
less index.html
# head 输出文件第一部分
# tail 输出文件最后一部分
# j向下一行滚屏 k向上一行滚屏
# 在:后输出/字符,就可以找到该文件内所有该字符所在位置
# gg 到文件头 G 到文件尾
# q 退出
5.重定向
重定向:
# 重定向 覆盖 >
date >output.txt
# 重定向 追加 >>
date >>output.txt
# 管道符 | (查看之后找出特定文件)
ls /bin|grep less #就可以找出所有文件中包含less关键字的文件了
# 上面的管道还可以这么些
ls /bin >bin.txt
grep less <bin.txt
在Linux系统中有一个习惯——把所有的东西都视为文件,文件、文件夹、设备等等都是文件。
有三类文件是一直打开的,stdin标准输入/stdout标准输出/stderr标准错误。
# 标准错误输出 重定向
ls shit 2>out.txt
# cat 合并文件(把两个文件内容合并到重定向的文件内)
cat file1 file2 >file
# uniq 报告或删除文件中的重复的行
cat files.txt
d.txt
a.txt
f.html
b.txt
b.txt
cat files.txt|uniq
d.txt
a.txt
f.html
b.txt
# grep 打印匹配行
cat files.txt|uniq|grep txt
d.txt
a.txt
b.txt
# sort 排序文件
cat files.txt|uniq|grep txt|sort
a.txt
b.txt
d.txt
6.用户和文件权限
# 查看用户权限命令(下面两个命令都可以)
ls -l 文件夹/文件
ll 文件夹/文件
Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源得用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。
用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户组织文件,并为用户提供安全性保护。
实现用户账号的管理,要完成的工作主要有如下几个方面:
- 用户账号的添加、删除与修改。
- 用户口令的管理。
- 用户组的管理。
Linux系统用户组的管理:
每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。不同Linux 系统对用户组的规定有所不同,如Linux下的用户属于与它同名的用户组,这个用户组在创建用户时同时创建。
附注:上面 - 是指文件的类型(可以是file、sym link、directory类型),1 是代表应用连接的数目(link number)、第一个peter是指所属用户、第二个peter是指所属的用户组、0 是代表文件大小、时间 是指最后修改时间。
附注:r w x对于文件和文件夹含义还不一样。
# 1. r (r对于文件夹来说可以读取文件夹内容,对于文件就是查看文件内容)
ls mydir (文件)
cat file (文件夹)
# 2. w (w对于文件是可以编辑文件内容,w对于文件夹是可以创建/删除重命名文件夹里面的文件)
edit file (文件)
create/delete/rename files in it (文件夹,w是只能对文件夹内的文件有相关操作)
# 3. x (x对于文件是指可以执行该文件,对于文件夹是可以cd进该目录)
. /a.sh (文件)
cd mydir (文件夹)
修改权限chmod:
chmod 666 a.txt
另一种方式
chmod [-cfvR] [--help] [--version] mode file...
参数说明:
- -c 若该文件权限确实已经更改,才显示其更改动作
- -f 若该文件权限无法被更改也不要显示错误讯息
- -v 显示权限变更的详细资料
- -R 对目前目录下的所有文件和子目录进行相同的权限变更(即以递回的方式逐个变更)
- –help 显示辅助说明
- –version 显示版本
mode:权限设定字串,格式如下:
[ugoa...] [[+-=] [rwxX]...] [,...]]
其中:
- u表示该文件的拥有者,g表示与该文件的拥有者属于同一个群体(group)者,o表示其他以为的人,a表示这三者皆是。
- +表示增加权限,-表示取消权限,=表示唯一设定权限。
r表示可读取,w表示可写入,x表示可执行,X表示只有当该文件是个子目录或者该文件已经被设定过为可执行。
实例:
将文件file1.txt设为所有人皆可读取:
chmod ugo+r file1.txt
# 或者
chmo a+r file1.txt
将文件file1.txt与file.txt设为该文件拥有者,于其所属同一个群体者可写入,但其他以为所有的人则不可写入:
chmod ug+w,o-w file1.txt file2.txt
将ex1.py 设定为只有该文件拥有者可以执行:
chmod u+x ex1.py
将目前目录下的所有文件与子目录设为任何人可读取:
chmod -R a+r *
7.进程
Linux ps命令用于显示当前进程(process)的状态。
ps [options] [--help]
参数:
- -A 列出所有的行程
- -w 显示加宽可以显示较多的资讯
- -au 显示较详细的咨询
- -aux 显示所有包含其他使用者的行程
# aux输出格式:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
- USER 行程拥有者
- PID pid
- %CPU 占用的CPU使用率
- %MEM 占用的记忆体大小
- VSZ 占用的虚拟记忆体大小
- RSS 占用的记忆体大小
- TTY 终端的次要装置号码
- STAT 该行程的状态(D、R、S、T、Z、W、<、N、L)
- START 行程开始时间
- TIME 执行的时间
- COMMAND 所执行的指令
实例:
# 1.显示进程信息
ps -A
# 2.显示root进程用户信息
ps -u root
# 3.显示所有命令,连带命令行
ps -ef
结束进程:
查出PID之后,就可以使用kill pid
就可以结束对应进程。
后台执行:
fg、bg、jobs、&、ctrl+z都是根系统任务有关的。
# 1.& 这个放在一个命令的最后,可以把这个命令放到后台执行
firefox &
# 2.crtl + z 可以将一个正在前台执行的命令放到后台,并且暂停
ctrl + z
# 3.jobs 查看当前有多少在后台运行的命令
# 4.bg 将一个在后台暂停的命令,变成继续执行,如果后台有多个命令,可以用bg %jobnumber 将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)
# 5.fg 将后台中的命令调至前台继续运行,如果后台有多个命令,可以用fg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)
Linux top命令:
Linux top命令用于实时显示process的动态。
top - [d/q/c/S/s/i/n/b]
- d 改变显示的更新速度,或是在交谈式指令列(interactive command)按s
- q 没有任何延迟的显示速度,如果使用者是有superuser的权限,则top将会以最高的优先序执行
- c 切换显示模式
- s 安全模式
- i 不显示任何闲置或者无用的行程
- n 更新的次数,完成后将会退出top
- b 批次档模式,搭配”n”参数一起使用,可以用来将top的结果输出到档案内
实例:
# 显示进程信息
top
# 显示完整命令
top -c
# 以批处理模式显示程序信息
top -b
# 以累积模式显示程序信息
top -S
# 设置信息更新次数(表示更新两次后终止更新显示)
top -n 2
# 设置信息更新时间(表示更新周期为3秒)
top -d 2
# 显示指定的进程信息(显示进程号为139的进程信息,CPU、内存占用率等)
top -p 139
# 将更新显示二次的结果输入到名称为top.log的档案里
top -n 2 -b < top.log
附注:终端里面的复制黏贴是Ctrl+Shift+c和Ctrl+Shift+v。
8.查找
1.locate 查找文件的命令是从数据库中查找的,所以,刚刚创建的文件需要运行一下updatedb命令才能及时将对应的文件信息写入到数据库中,否则系统会根据默认的时间来执行的(一般是一天一次)。
locate 用于查找系统中所有路径中包含对应的字样的文件,注意,他也支持正则表达式,通过文件名查找文件。
locate demo
# 使用正则表达式
locate --regexp 正则表达式
2.find 在目录层次结构中搜索文件
# 查看目录内所有文件
find .
# 查看.txt结尾的文件
find .|grep .txt
# 文件类型
find -type f
# 目录类型
find -type d
# exec执行后续命令
find . -type f -exec ls -l '{}' ';' #找到的文件,通过-exec参数直接执行ls命令
find . -type f -exec grep hello '{}' ';' #-exec直接执行grep 查找有hello内容的文件
find . -type f -exec grep hello '{}' ';' -print #打印出查找出的具体的文件名
find . -type f -exec grep -n hello '{}' ';' -print #打印出查找出的文件出现的行数
find . -type f -exec grep -ni hello '{}' ';' -print #不区分大小写的查找
3.grep 过滤字符串 ,主要用于字符串查找
find .|grep .txt # find之后,再使用grep过滤,寻找.txt的文件
9.网络操作
ssh和rsync的使用。
ssh(远程操作工具)
rsync(数据传输工具)
10.安装软件
三种方式:手动安装、deb包、从apt-get仓库安装。
deb包包括程序本身、配置文件、安装位置和依赖关系。
11.shell脚本编程
Shell编程:
指定解析器:(指定用bash去解析下面的语句,也可以指定为ruby/python)
#! /usr/bin/env bash
语句即命令:(在terminal就是命令,在脚本里面就是语句)
say_hello(){
echo "hello"
}
位置参数:
执行脚本:$ peter.sh a.txt b.txt
$#:代表一共有几个参数,这里为2
$0:代表程序名,即peter.sh
$1:代表第一个参数,即a.txt
$2:代表第二个参数,即b.txt
脚本不在当前shell执行:
在shell中执行脚本,并不是在当前shell中执行,而是新开一个shell执行。如果指定在当前shell中执行脚本,用source命令:source peter.sh。
循环控制:
重命名指定目录下文件为文件名.txt
rename脚本:
#!/usr/bin/env bash
cd $1
echo I am in `pwd`
for file in `ls`
do
mv $file $file.txt
done
执行脚本:./rename.sh mydir/
远程执行:
ssh -t 登录信息 执行语句
例如:ssh -t peter@happycasts.net 'touch a.txt'
确定执行:
echo -n "Want to sync? (y/n):"
read AAA
if [ "${AAA:-y}" = "y" ];then
xxx
else
echo Nothing done, bye.
fi
其他语言脚本: