【Linux】前端也需要了解的 Linux 快速入门基础
汉化
linux汉化
-
查看有没有中文包
locale -a |grep CN
-
没有就下载
yum install -y langpacks-zh_CN
-
修改语言配置文件为
LANG="zh_CN.UTF-8"
vi /etc/locale.conf source /etc/locale.conf
man的汉化
-
直接安装
-
Debian安装
sudo apt update sudo apt install manpages-zh
-
CentOS7
yum update yum install man-pages-zh-CN
-
-
源码安装
源码网址
-
获取安装包
wget https://src.fedoraproject.org/repo/pkgs/man-pages-zh-CN/manpages-zh-1.5.1.tar.gz/13275fd039de8788b15151c896150bc4/manpages-zh-1.5.1.tar.gz
-
-
解压并安装(最好使用root)
tar xf manpages-zh-1.5.1.tar.gz cd manpages-zh-1.5.1/ ./configure --disable-zhtw --prefix=/usr/local/zhman make && make install
-
为了不覆盖man,我们新建cman命令作为中文查询
cd ~ echo "alias cman='man -M /usr/local/zhman/share/man/zh_CN' " >>.bash_profile source .bash_profile
报错解决
yum安装软件报错:Invalid configuration value:
shell入门
…代表可有一个或多个
目录结构
目录 | 描述 |
---|---|
/home | 用户目录 |
/opt | 安装可选软件 |
/root | root用户主目录 |
/usr | 普通用户使用的相关文件 |
/usr/bin | linux命令相关文件 |
/usr/lib | /usr/bin目录中使用的共享库 |
/usr/local | 并非系统自带 却想让系统使用的文件 如node |
/usr/sbin | 包含更多的系统管理程序 |
/usr/share | /usr/bin中的程序使用的共享数据 |
/bin | 系统启动需要的二进制文件 |
/boot | Linux系统文件 |
/dev | 存放一切Linux可识别的设备的文件 |
/etc | 有趣的目录 |
/lib | 核心系统使用的共享库 |
/lost+found | 当Linux系统宕机或者崩溃时 用于恢复分区 |
/media | 可移除设备的的挂载点 如u盘 鼠标 |
/mnt | 手动挂载的可移除设备的挂载点 |
/proc | Linux内核维护的虚拟文件系统 |
/sbin | 放系统的二进制文件 执行重要的系统任务 这个任务为超级用户预留 |
/temp | 各类程序放置临时文件 |
/var | 动态文件 如日志 |
/var/log | 日志文件 |
基本操作命令
cd
切换目录
命令 | 结果 |
---|---|
cd |
切换到用户目录 |
cd- |
切换到先前的目录 |
cd~username |
切换到用户目录 |
ls
列出当前目录下以.html结尾的文件
ls *.html
参数列表
参数 | 长参数 | 描述 |
---|---|---|
-a | --all |
列出所有文件 |
-d | --directory |
一般查看目录是显示目录内内容信息 而-d显示目录的信息 |
-F | --classify |
列出类型指示符 如目录会在目录名后加上/ |
-h | --human-readable |
以长格式列出,并以MB,GB等格式替换字节数显示文件大小 |
-l | 以长格式显示结果 | |
-r | –reverse | 以相反的顺序显示结果 |
-S | 按文件大小对文件排序 | |
less
查看文件
命令 | 结果 |
---|---|
less filename |
查看文件 |
pageup或b |
后翻一页 |
pagedow 或spacebar |
前翻一页 |
↑ |
向上一行 |
↓ |
向下一行 |
G | 文件末尾 |
g或1G | 文件开头 |
/xxx | 查找xxx字符串 |
n | 下一个xxx字符串 |
h | 显示帮助 |
q | 退出 |
file
确定文件类型
语法
file 文件
文件操作
命令 | 描述 |
---|---|
cp |
复制文件和目录 |
mv |
移动或重命名文件和目录 |
mkdir |
创建目录 |
rm |
删除文件和目录 |
in |
符号链接 |
通配符
通配符可以用在一切以文件名做参数的命令
常见通配符
通配符 | 匹配项 |
---|---|
* |
匹配任意多个字符 |
? | 匹配任意单个字符 |
[characters] | 匹配任意一个属于字符集的字符 |
[!characters] | 匹配任意一个不属于字符集的字符 |
[[:class:]] | 匹配任意一个字符类中的字符 |
常用字符类
字符类 | 匹配项 | |
---|---|---|
[:alnum:] |
匹配一个字母或数字 | |
[:alpha:] |
匹配一个字母 | |
[:digit:] |
匹配一个数字 | |
[:lower:] |
匹配一个小写字母 | |
[:upper:] |
匹配一个大写字母 |
通配符示例
形式 | 匹配项 |
---|---|
a* |
以a 开头 |
a*.txt |
a 开头.txt 结尾 |
a??? |
a 开头后面三个字符 |
[abc]* |
以abc 中一个字符开头 |
mkdir
新建目录
语法
mkdir dir...
cp
复制目录或文件
-
将一个或者多个项目(文件或文件夹)复制到一个文件夹内
cp [options] item... directory
-
将一个文件复制为另一个文件
cp file1 file2
options
选项 | 定义 |
---|---|
-a |
复制其属性,包括权限和所有权,也可用于递归复制文件夹内容 |
-i |
如果覆盖文件,默认无提示,加上后有提示 |
-r |
递归复制目录和其内容 |
-u |
从一个目录复制到另一个目录时,只会复制目标目录没有的文件和已更新文件 |
-v |
显示消息 |
示例, 将
dir1
下所有文件复制到dir2
cp dir1/* dir2
mv
移动文件或文件夹
-
语法1, 将一个或者多个项目(文件或文件夹)移动到一个文件夹内
cp [options] item... directory
-
语法2,将一个文件移动并重命名为另一个文件
cp [options] file1 file2
options
选项 | 定义 |
---|---|
-i |
如果覆盖文件,默认无提示,加上后有提示 |
-u |
从一个目录复制到另一个目录时,只移动目标目录没有的文件和已更新文件 |
-v |
显示消息 |
rm
删除目录或文件
语法,移除项目(文件或目录)
rm item
options
选项 | 定义 |
---|---|
-i |
如果删除一个存在的文件,默认无提示,加上后有提示 |
-r |
递归删除目录和其内容 |
-v |
显示消息 |
-f |
强制删除,覆盖-i 选项,忽略不存在的文件并不提示 |
ln
-
硬链接
ln file link
-
软链接
ln -s file link
关于命令的命令
命令 | 描述 |
---|---|
type |
recognize command |
which |
where is the command |
man |
使用less显示文档手册,还可指定命令类别查询 |
apropos |
显示合适的命令 |
whatis |
显示命令的info条目 |
info |
显示一条命令的简述 |
alias |
创建一条命令的别名 |
type
显示命令的类别
语法
type command
command
为命令
which
显示可执行文件的位置
语法
which command
示例
which ls/bin/ls
help
查看文档 大部分的命令都支持
--help选项
语法
command --help
man
语法
man [-adfhktwW] [section]
-
[-adfhktwW]
参数 备注 -a 显示所有匹配项 -d 显示man查照手册文件时候,搜索路径信息,不显示手册页内容 -D 同-d,显示手册页内容 -f 同命令whatis ,将在whatis数据库查找以关键字开同的帮助索引信息 -h 显示帮助信息 -k 同命令apropos 将搜索whatis数据库,模糊查找关键字 -S list 指定搜索的领域及顺序 如:-S 1:1p httpd 将搜索man1然后 man1p目录 -t 使用troff 命令格式化输出手册页 默认:groff输出格式页 -w 不带搜索title 打印manpath变量 带title关键字 打印找到手册文件路径,默认搜索一个文件后停止 -W 同-w section 根据手册类型默认查找所有手册 -
section
手册类型序号 定义 1 可执行文件或者shell命令 2 系统调用(内核提供的函数) 3 库函数 4 特别的文件(通常在/dev) 5 文件格式,如/etc/passwd 6 游戏 7 杂项(包括宏包) 8 系统管理员命令(通常给root用户使用) 9 内核例程(非标准例程)
appropos
显示合适的命令 没什么用
whatis
显示一行命令描述
用法
whatis command
info
GNU用来替代手册文档界面
alias
用于给一连串的命令起一个容易记住的名字,, 在本次退出登录后消失
定义一个
myc
的命令 执行myc
会执行cd /usr; ls
alias myc='cd /usr;ls'
查看全部的别名命令
alias
查看定义的命令
type myc
删除别名
unalias myc
io文件重定向
命令 | 描述 |
---|---|
cat |
合并文件 |
sort |
对文本排序 |
uniq |
报告或删除文件中重复行 |
wc |
打印文件中换行符,字,字节的个数 |
grep |
打印匹配行 |
head |
输出文件第一部分 |
tail |
输出文件最后一部分 |
tee |
读取标准输入数据,将内容输出到标准输出和文件 |
>
在Linux的世界里一切都是文件,屏幕上显示的文字也应该是一个文件
-
输出:
比如
ls
命令会在屏幕上显示当前目录信息,ls是一个程序,正常执行后ls将结果发送到一个名叫标准输出(standard output)的文件中,如果发生错误,就发送到一个叫标准错误(standard error)的文件中,这两个文件一般都被链接到屏幕上,但是我们可以通过改变其行为 -
输入:
比如键盘就是通过标准输入文件(standard input)文件输入字母和数字
-
IO:
一般输出程序都会将结果发送到屏幕,但是我们使用
IO重定向
可以改变这种默认行为在Linux中用0,1,2分别表示标准输入文件,标准输出文件,标准错误文件
-
>
覆盖式写入语法 将command的标准输出信息重定向到file文件
command [012]> file
示例
-
将输出信息重定向到
log.txt
文件,只重定向标准输出,不重定向标准错误ls -l > log.txt
-
重定向标准错误, 尝试列出一个不存在的文件目录,会输出一个错误信息
ls -l /unexistFile 2> log.txt
-
清空
log.txt
文件内容> log.txt
-
.将标准错误和标准输出都重定向到同一个文件
-
普通方式
ls -l /unexistFile > log.txt 2>&1
-
bash提供的新方式
ls -l /unexistFile &> log.txt
-
-
处理不想要的信息
/dev/null
接收输入但不处理ls -l > /dev/null
-
cat
cat命令读取一个或多个文件,并将它们复制到标准输出文件
语法 […]表示0个或多个
cat [file...]
-
将多个文件合并为同一个文件
cat file1 file2... > file
-
cat从标准输入读取内容
cat
-
将标准输入内容重定向到文件,用
Ctrl + d
告诉cat已经到了EOF
(终止)cat > log.txt
-
将标准输入从键盘更改到文件
cat < log.txt
|
可以将一个命令的标准输出送到另一个命令的标准输入
语法
command1 | command2
示例
ls -l | less
sort
将标准输入来的数据排序
示例
ls | sort | less
uniq
报告或忽略标准输入中的重复行
示例
-d
用于报告重复行,不加默认删除重复行
ls | sort | uniq [-d] | less
wc
打印行数,字数和字节数
-
直接用于文件
wc log.txt
-
处理标准输入流
-l
只报告行数ls | wc [-l]
grep
打印匹配行
-
只打印能符合该模式的行,pattern为正则表达式
grep pattern [file...]
-
查询名字中带zip的文件
-i
忽略大小写,-v
只输出不匹配的行ls -l | grep zip
head
打印文件的开头,默认打印十行,可以使用
-n
指定行数
-
直接用于文件
head -n 5 log.txt;
-
管道
ls | head -n 5;
tail
可以用于动态查看文件的末尾,这个命令查看动态变化文件很有效
-
直接用于文件
tail -n 5 log.txt;
-
管道
ls | tail -n 5;
tee
tee读取标准输入并将结果发送到标准输出和文件中
示例
ls | tee log.txt | grep zip
扩展
echo
将文本参数内容打印到标准输出
路径名扩展
输出当前目录全部以s结尾文件名
echo *s
波浪线扩展
输出na用户主目录路径
ehco ~na
算数扩展
输出2+2结果 只支持整数运算 以$((express))为一个表达式
echo $((2+2))
花括号扩展
输出i=1 i=2 i=3
echo i={1,2,3};
echo i={1..3};
该技术一般用于创建多个文件或目录 如创建2009-2011两年全部月份
mkdir {2009..2011}-0{1..9} {2009..2011}-{10..12}
变量
输出user变量
echo $user
查看可用变量
printenv
命令替换
命令替换可以把一个命令的输出当成一个扩展模式,即把一个命令的输出当成另一个命令的参数
用
ls -l
的方式列出cp
命令的位置
ls -l $(which cd);
双引号引用
用于抑制shell中除
$
,\\
,'
除外的特殊字符,将他们变为普通文本,如解决文件名中有空格的情况
ls -l "six pence.txt"
单引号引用
抑制全部的shell扩展
转义字符
转义单个字符
echo \\$
sleep
一个简单的程序 在等待指定秒数后结束
sleep 10; ls -l
键盘技巧
组合键
-
移动光标
组合键 作用 Ctrl + A
移动光标到行首 Ctrl + E
移动光标到行尾 Ctrl + F
同 →
Ctrl + B
同 ←
Ctrl + F
从光标位置清屏 -
修改文本
组合键 作用 Ctrl + D
删除光标位置字符 Ctrl + T
光标位置和前一位字符交换位置 Alt + T
光标位置和前一个字换位(字为以空格分隔的单词) Alt + L
从光标处到字尾全部变成小写字母 Alt + U
从光标处到末尾全部变成大写字母 -
剪切粘贴
组合键 作用 Ctrl + K
剪切从光标到行尾 Ctrl + U
剪切从光标到行首 Alt + D
剪切从光标到词尾 Alt + backspace
剪切从光标到词头,如果现在已在词头,剪切上一个单词 Ctrl + Y
把 kill-ring
缓冲区的文本复制到光标位置
history
命令历史记录,默认保存五百行,可更改
-
跳到历史命令的88行
!88
-
逆向递归查找, 按下
Ctrl + R
,输入要查找的命令 , 按enter
执行命令, 按ctrl + j
复制命令到命令行,可继续编辑
权限
命令 | 定义 |
---|---|
id |
显示用户身份标识 |
chmod |
更改文件模式 |
su |
切换用户 |
sudo |
以另一个用户身份执行 |
chown |
更改文件拥有者 |
chgrp |
更改文件群组 |
passwd |
更改用户密码 |
id
运行结果
uid
是用户唯一标识,gid
表示有效组id,groups表示用户所在的所有组
uid=1002(ja) gid=1003(ja) groups=1003(ja)
ls结果分析
ls -l 结果分析
文件权限和类别 | 数量 | 所属者 | 所属组 | 文件字节大小 | 文件创建时间 | 文件名 |
---|---|---|---|---|---|---|
drwxr-xr-x |
3 |
root |
root |
4096 |
Oct2613:58 |
file |
-
文件权限和类别
文件类型 所有者权限 组权限 其他用户权限 d
rwx
r-x
r-x
-
文件类型
属性 文件类型 -
普通文件 d
目录文件 l
符号链接 c
字符设备文件 b
块设备文件 -
权限描述符
属性 文件 目录 r 允许打开和读取文件 在 x
条件下允许列出目录下内容w 允许写入文件 允许对目录内文件重命名和删除 x 允许把文件当作文件执行 允许进入目录
-
-
数量
-
当文件为目录时,数量栏对应目录下的子目录个数
-
当文件不是目录时,数量栏对应文件的硬链接个数
chmod
只有文件所有者和超级管理员才可以更改文件或目录的权限
-
八进制表示法
chmod 777 log.txt
八进制 | 描述 | 文件模式 |
---|---|---|
0 | 无权限 | - - - |
1 | 可执行 | - - x |
2 | 可写 | - w - |
3 | 可写可执行 | - w x |
4 | 可查 | r - - |
5 | 可查可执行 | r - x |
6 | 可查可写 | r w - |
7 | 可查可看可写 | r w - |
-
符号表示法
所属者权限加读写查,所属组不可读写,其他人只能读
加减为在原基础上加减,赋值为直接赋值相应权限,多项之间用
,
(逗号)隔开chmod u+rwx,g-wx,o=r log.txt
+
为增加权限,-
为减少权限 =为赋值权限
符号 | 含义 |
---|---|
u |
所属者 |
g |
所属组 |
o |
所有用户 |
a |
以上全部 |
umask
用于设置创建文件时设置的默认权限
umask 0002
查看默认权限
umask
su
格式
-l
选项用于改变运行环境 可以省略为-
user
不写的话默认是root
用户
su [-[l]] [user]
即我们可以通过下命令执行切换到root用户的身份和环境
su -
使用su命令执行一个新命令而不开启一个新的命令界面
su -c 'command'
使用exit回到原用户身份
exit
sudo
sudo
用于允许普通用户直接运行其他用户身份(一般是root
),只需要输入当前用户密码即可注:sudo默认会重置环境变量,使用-E参数或更改配置
sudo rm -rf /
可执行的命令在
/etc/sudoer
中指定 ,使用下列命令查看可运行的命令
sudo -l
sudo
找不到命令解决,查看sudo
配置,搜索secure_path
将命令路径,将命令位置配入
sudo visudo
xxx用户无需密码即可进行sudo
XXX ALL = NOPASSWD: ALL
chown
更改用户所有者和所属组
基本格式
chown [owner][:[group]] file...
-
修改所有者为a 不改变所属组
chown a file...
-
修改所有者为a 把文件所属群组设为A
chown a:A file...
-
修改文件所属组为A 但不改变所有者
chown :A file...
-
修改文件所有者为a, 所属组改变为a登录时所属的组
chown a: file...
chgrp
早期更改用户组方式
passwd
修改用户密码
格式 缺省user默认修改当前用户密码,root用户还可指定用户密码失效和账户冻结等操作
passwd [user]
进程
命令 | 作用 |
---|---|
ps |
显示当前所有进程 |
top |
实时显示当前所有任务占用情况 |
jobs |
列出所有活动作业的状态信息 |
bg |
设置在后台中运行作业 |
fg |
设置在前台运行作业 |
kill |
发送信号给某个进程 |
killall |
杀死指定名字的进程 |
shutdown |
关机或重启系统 |
ps
标准查看进程
ps -ef
另一种查看进程方式
ps aux
执行后的结果
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
USER |
PID |
%CPU |
%MEM |
VSZ |
RSS |
TTY |
STAT |
START |
TIME |
COMMAND |
---|---|---|---|---|---|---|---|---|---|---|
进程拥有者 | 进程号id | 占用CPU 使用率 | 占用的内存使用率 | 占用的虚拟记忆体大小 | 占用的记忆体大小 | 终端的次要装置号码 | 该进程的状态 | 进程开始时间 | 执行的时间 | 所执行的指令 |
进程状态stat
状态 | 含义 |
---|---|
D |
不可中断的睡眠状态,进程在等待I/O 操作 |
R |
正在运行 |
S |
睡眠状态 |
T |
暂停状态 |
Z |
无效或僵尸进程,子进程被结束,但是还没有被父进程释放 |
W |
没有足够的记忆体分页可分配 |
< |
高优先序的行程 |
N |
低优先序的行程 |
L |
有记忆体分页分配并锁在记忆体内 (实时系统或I/O ) |
top
示例 实时显示进程, 默认三秒更新一次
top
结果
top - 16:27:37 up 24 min, 2 users, load average: 0.03, 0.06, 0.09
Tasks: 221 total, 1 running, 220 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 3.2 sy, 0.0 ni, 96.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 995920 total, 255232 free, 373780 used, 366908 buff/cache
KiB Swap: 2047996 total, 1749500 free, 298496 used. 415468 avail Mem
结果分析
行 | 字段 | 含义 |
---|---|---|
1 | top |
程序名 |
16:27:37 |
当前时间 | |
up 24 min |
正常运行时间 | |
2 users |
两个用户 | |
load average |
负载均值,分别对应前六秒,前五分钟,前十五分钟 | |
2 | tasks |
进程数和状态 |
3 | 0.0 us |
用户进程占用CPU率 |
3.2 sy |
系统进程占用CPU率 | |
0.0 ni |
低优先级进程占用CPU率 | |
96.8 id | 空闲CPU率 | |
0.0 wa |
等待I/O操作进程占用CPU率 | |
4 | mem |
物理RAM使用情况 |
Swap | 交换空间使用情况 |
中断进程
Ctrl + c
后台运行
语法,让一个命令在后台运行
command &
使用
jobs
或不带参数的ps
查看从该终端启动的作业,
jobs
jobs结果
[1]
表示其jobspec
,即作业编号为1
[1]+ Running gedit &
前台运行
jobspec
是作业编号, 如果只存在一个作业,则可以省略jobspec
fg %[jobspec]
暂停进程
对前台进程进行
Ctrl + z
暂停进程 】进程暂停后可用
bg
或fg
将其重新运行
kill
kill并不是用来终止进程的,而是给进程发送信号的,程序可以监听信号并在接收到信号后执行相应操作
语法
kill [-signal] PID
常用信号
[signal]
信号编号 | 信号量 | 含义 |
---|---|---|
1 | HUP |
挂起信号,前台程序接收到会终止,该信号也被许多后台程序用于重新初始化 |
2 | INT |
中断信号,和Ctrl + C 一个效果 |
9 | KILL |
杀死信号,该信号不发送给程序处理,而是发送给内核,内核直接杀死进程 |
15 | TERM |
终止信号,默认信号类型,让程序自己终止 |
18 | CONT |
继续运行信号,用于恢复STOP 信号 |
19 | STOP |
暂停信号,该信号和KILL 类似,也不发送给程序处理 |
killall
语法
killall [-u user] [-signal] name...
示例 发送终止信号给由root发起的node和nginx进程
killall -u root -15 node nginx
进程相关命令
命令 | 描述 |
---|---|
pstree |
树结构输出进程列表 |
vmstat |
输出系统使用资源快照 |
xload |
绘制系统时间负载情况的一种图形化界面 |
tload |
类似xload 但是图形在终端绘制 |
配置与环境
环境
命令 | 描述 |
---|---|
printenv |
打印部分或全部的环境信息 |
set |
设置shell选项 |
export |
将环境导出到要运行的程序 |
alias |
为命令创建别名 |
set
set会同时显示shell变量和环境变量,比较冗长
set
printenv
语法 可以缺省列出所有,也可指定变量名列出
printenv [variable]
PATH
环境是在用户登录时,bash会启动并读取一系列配置文件
login和non-login
shell会话有两种,无登录会话典型为GUI界面直接启动的终端
-
需要登录会话(
login
)文件 说明 etc/profile 全局配置脚本,适用于所有用户 ~/bash.profile 用户的个人启动文件 ~/bash_login bash_profile
读取失败后尝试读取此文件~/profile 前两项都读取失败后读取此文件,在detain版本中此为默认值 -
不需要登录会话
文件 内容 /etc/bash.bashrc 全局配置脚本 ~/.bashrc 用户个人启动文件
新增环境变量
执行命令可新增环境变量,环境变量间用:分割,
export PATH
用于让shell子进程使用PATH
的内容用户修改环境变量应修改~/.bash_profile或与其等价的配置文件
其他修改应放于
.bashrc
文件中
PATH=$PATH:路径
export PATH
vi
常用快捷键
常用快捷键
命令 | 描述 |
---|---|
0 |
光标移至行首 |
$ |
光标移至行尾 |
o |
下一行插入文本,大写为上一行插入 |
ndd |
向下剪切n行,n可省略 |
nyy |
向下复制n行,n可省略 |
p |
在下一行粘贴,大写为上一行粘贴 |
/pattern |
向下查找 / 换成? 为向上查找,n 跳到下一个匹配项 |
n1,n2s/p1/p2/g |
将n1 至n2 行之间的p1 替换成p2 , n1 ,n2 可为%(全部)和省略(本行) |
`n1,n2 [co | m |
set nu |
显示行号 |
n |
跳到第n行 |
快捷键大全
移动光标
命令 | 描述 |
---|---|
h |
光标左移一个字符 |
j |
光标上移一个字符 |
k |
光标下移一个字符 |
l |
光标右移一个字符 |
0 |
光标移至行首 |
$ |
光标移至行尾 |
H |
光标移至屏幕首行 |
M |
光标移至屏幕中间 |
L |
光标移至屏幕最末行 |
插入文本
命令 | 描述 |
---|---|
i |
在光标前插内内容 |
a |
在光标后插入内容 |
o |
在所在行的下一行插入新行 |
O |
在所在行的上一行插入新行 |
删除文本
命令 | 描述 |
---|---|
x |
删除光标后面的字符 |
X |
删除光标前面的字符 |
nx |
删除光标后面n个字符 |
nX |
删除光标前面的n个字符 |
d0 |
删除光标至行首的内容 |
d$ |
删除光标至行尾的内容 |
dd |
删除整行 |
ndd |
向下删除n行 |
复制粘贴文本
命令 | 描述 |
---|---|
yy |
复制整行 |
nyy |
复制n行 |
p |
小写p在所在行下一行粘贴 |
P |
大写P在所在行上一行粘贴 |
dd |
剪切 |
查找文本
命令 | 描述 |
---|---|
/pattern |
向下查找 |
?pattern |
向上查找 |
n |
顺序查找 |
N |
反向查找 |
/p1/p2/gc |
在当前行,将p1替换成p2, g为替换多个,c为替换前提示 |
n1,n2s/p1/p2/gc |
将n1至n2行之间的p1替换成p2 |
屏幕翻滚
快捷键 | 描述 |
---|---|
ctrl+u |
向文件首翻半屏 |
ctrl+d |
向文件尾翻半屏 |
ctrl+f |
向文件尾翻一屏 |
ctrl+b |
向文件首翻一屏 |
末行命令
命令 | 描述 |
---|---|
n1,n2 co n3 |
将n1至n2行复制到n3行的下面 |
n1,n2 m n3 |
将n1至n2行剪切至n3行的下面 |
n1,n2 d |
将n1至n2行删除 |
w |
保存 |
q |
退出 |
x |
保存并退出 |
q! |
强制退出 |
w! |
强制保存 |
n |
定位到n行 |
set nu |
显示行号 |
set nonu |
取消行号 |
u |
取消上一次操作 |
常见任务与主要工具
软件包管理
软件包系统工具
发行版本 | 低级工具 | 高级工具 |
---|---|---|
Debian | dpkg |
apt-get , aptitude |
Centos | rpm |
yum |
查找软件包
在库中查找xxx软件包
系统类型 | 命令 |
---|---|
Debian | apt-get update apt-cache search package_name |
Centos | yum search package_name |
在本机中查询已安装的软件包
系统类型 | 命令 |
---|---|
Debian | dpkg --list |
Centos | rpm -qa |
安装软件包
安装库中的软件包
系统类型 | 命令 |
---|---|
Debian | apt-get update apt-cache install package_name |
Centos | yum install package_name |
安装软件包文件中的软件包,低级安装方式,不会自动解析依赖,可直接安装类似于.rpm结尾的软件包文件
系统类型 | 命令 |
---|---|
Debian | dpkg --install package_file |
Centos | rpm -i package_file |
卸载软件包
即可用高级工具也可用低级工具,以下为高级工具
系统类型 | 命令 |
---|---|
Debian | apt-get remove package_name |
Centos | yum erase package_name |
更新软件包
更新库中的软件包
系统类型 | 命令 |
---|---|
Debian | apt-get update apt-get upgrade |
Centos | yum update |
更新软件包文件中的软件包
系统类型 | 命令 |
---|---|
Debian | dpkg --install package_file |
Centos | rpm -U package_file |
软件包是否已安装
系统类型 | 命令 |
---|---|
Debian | dpkg --status package_name |
Centos | rpm -q package_name |
已安装软件包的信息
系统类型 | 命令 |
---|---|
Debian | apt-cache show package_name |
Centos | yum info package_name |
查询文件由哪个软件包安装
系统类型 | 命令 |
---|---|
Debian | dpkg --search package_file |
Centos | rpm -qf package_file |
网络相关
命令 | 描述 |
---|---|
ping | 向网络主机发送ICMP ECHO_REQUEST数据包 |
traceroute | 显示数据包到网络主机的路径 |
netstat | 显示网络连接,路由表,网络接口数据,伪连接以及多点传送成员等信息 |
ftp | 文件传输命令 |
lftp | ftp升级版 |
wget | 非交互式下载器 |
ssh | OpenSSH客户端登录远程服务器 |
scp | 远程复制文件命令 |
sftp | 安全文件传输方式 |
IPaddress | ip地址 |
host and domain name | 主机名和域名 |
URL | 统一资源标识符 |
ping
向网络主机发送ICMP ECHO_REQUEST数据包
traceroute
跟踪网络数据包的传输路径
一行代表一个路由器
路由器不提供身份的话为
*
netstat
ssh
ssh用于安全的登录远程计算机
如果服务端的SSH修改导致密匙不配对 可以删除~/ssh/known_hosts删除本地密匙文件
rm -f ~/.ssh/known_hosts
通过ssh直接执行命令
ssh root@服务器地址 'ls -al' > 本地文件
scp
用root的身份将远程服务器的
/file.txt
下载到本机的/opt
目录下
scp root@124.221.93.15:/file.txt /opt
sftp
登录
sftp 124.221.93.15
加
!
执行本地shell命令,不加执行远程命令
!ls
使用
get
命令可以从远程服务器拉取文件到本地,newName
默认为远程文件名-r拉取整个目录
get [-r] remoteFile [newName]
使用
put
命令可以从本地上传文件到服务器:
put localFile
可以使用
-r
参数来上传整个目录,但是有一点要注意,如果服务器上不存在这个目录需要首先新建:
mkdir folderName
put -r folderName
文件操作
命令 | 描述 |
---|---|
locate |
通过文件名查找 |
find |
在文件系统目录中查找 |
xargs |
从标准输入中建立和执行命令行 |
touch |
更改文件日期时间 |
stat |
显示文件或文件系统的状态 |
locate
快速搜索数据库,查找路径名和指定字符串匹配的文件
可以理解成将所有路径名字符串放入数据库,然后查询条件为模糊查询字符串
更新数据库
updatedb
查找路径名中带bin/zip的文件
locate bin/zip
find
-
test选项
限制搜索条件
简单使用,查找用户主目录下类型为
文件
的后缀名为.jpg
的大于1mb
的文件,显示行数find ~ -type f -name "*.jpg" -size +1M | wc -l
文件类型 描述 f 普通文件 c 字符设备 l 符号链接 b 块设备文件 d 目录 test选项表
±n:-n指n天以内,+n指n天以前
选项 描述 -name 按名称查找 -size ±nM 查n mb的文件 -type 按类型查找 -user 按文件所属用户 -group name 按文件所属组 -mtime ±n 按更改时间 -atime ±n 按读取时间 -ctime ±n 按创建时间 -newer f1 [!f2] 在f1更改后更改的文件,f2可选,比f2更新晚的文件 -depth 先查完本目录再查子目录 -prune 忽略某个目录 -perm 按权限查找 如八进制表示的权限和rwx表示的权限 -nogroup 无有效属组,即文件的属组在/etc/groups中不在 -nouser 无有效属主,即文件的属主在/etc/passwd中不存 -fstype #查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到 -mount 查文件时不跨越文件系统mount点 -follow 如果遇到符号链接文件,就跟踪链接所指的文件 -mount 查文件时不跨越文件系统mount点 -follow 如果遇到符号链接文件,就跟踪链接所指的文件 -cpio 对匹配的文件使用cpio命令,将他们备份到磁带设备中
操作符
查找访问权限不是0600的文件和访问权限不是0700的目录
find ~ \\(-type f -not -prem 0600\\) -or \\(-type d -not -perm 0700)
操作符 | 功能描述 |
---|---|
-and | 与,可缩写成-a |
-or | 或,缩写为-o |
-not | 非,缩写为-! |
() | 因为()在命令行中有含义,所以使用\\( \\) |
-
action选项
对搜索到的文件进行操作
动作 描述 -delete 删除匹配文件 -ls 以ls输出匹配的文件 -print 默认操作 -quit 一旦匹配就直接退出 -
-exec 可替换为 -ok 可执行用户自定义命令
-exec直接执行,-ok需要用户手动一次次确认
每查找到一个文件执行一次列出当前目录下的文件列表
{}代表当前目录
find ~ -name '*foo' -ok ls -l '{}' ';'
-
-xargs
从标准输入中重建命令行 , 将find的结果作为一个标准输入
find ~ -name '*foo' | xargs ls -l
find提供了相似的方法,只需要把末尾的分号改成+
find ~ -name '*foo' -ok ls -l '{}' '+'
归档与备份
命令 | 描述 |
---|---|
gzip | 压缩和解压缩文件工具 |
bzip2 | 块排序文件压缩工具 |
tar | 磁带归档工具 |
zip | 打包和压缩文件 |
rsync | 远程文件和目录的同步 |
gzip
gzip命令执行后原文件会被压缩文件替代
gunzip命令等于gzip -d,用于解压缩文件
仅查看压缩文件内容
zcat t.txt.gz
cat t.txt.gz | zless
vim t.txt.gz
gzip -c t.txt.gz
参数
参数 | 功能描述 |
---|---|
-r | 递归压缩目录 |
-t | –test 检验压缩文件完整性 |
-v | 在压缩时显示压缩信息 |
-d | 解压缩,类似于gunzip |
-f | 强制压缩,即使源文件的压缩版本已经存在 |
-c | 将压缩后的内容写到标准输出,源文件不变 |
-h | –help |
-l | 列出压缩文件的压缩统计 |
-n | 压缩级别,n为1(最快)-9(最慢,压缩比率最高) |
bzip2
牺牲速度换取高质量的数据压缩
参数和gzip类似,在压缩级别和gzip略有不同
bzip2解压用bunzip2,查看用bcat
bzip还有专门的bzip2recover命令用于修复损坏的.bz2文件
tar
归档是把多个文件归并为一个文件
解压tar.gz文件
tar -zxvf xxx.tar.gz
将etc文件夹压缩成tar文件
tar cf etc.tar /etc
zip
和Windows交互才会使用的压缩方式
unzip为解压
基本用法
zip options zipfile file
将etc文件夹压缩成zip文件
zip -r etc.zip /etc
rsync
用于在网络上快速实现本地和远程文件的同步和更新
同步/etc到~/etc
-a用于递归归档和保留文件属性
-v用于列出压缩信息
–delete用于删除源文件已经被删除但备份
rsync -av --delete /etc ~/etc
备份本地关键文件到远程的/backup目录
–rsh用于指定ssh命令用于远程shell命令
rsync -av -rsh=ssh /etc /home /usr/local root@124.221.93.15:/backup
sed
sed 命令的基本格式如下:
sed [选项] [脚本命令] 文件名
选项
选项 | 含义 |
---|---|
-n | 默认情况下,sed 会在所有的脚本指定执行完毕后,会自动输出处理后的内容,而该选项会屏蔽启动输出,需使用 print 命令来完成输出 |
-i | 此选项会直接修改源文件,在源文件的匹配行上一行添加 |
-e 脚本命令 | 该选项会将其后跟的脚本命令添加到已有的命令中 |
-f 脚本命令文件 | 该选项会将其后文件中的脚本命令添加到已有的命令中 |
脚本命令
[address] 'operate[flag]'
address 表示指定要操作的具体行, operate为操作,如替换,删除等,在下文中有介绍,flag为标记操作
operate
-
替换命令s
基本格式
pattern 指的是需要替换的内容,replacement 指的是要替换的新内容
s/pattern/replacement/
一行中替换第二个匹配的
sed 's/test/trial/2' test.txt This is a test of the trial script This is the second test of the trial script
只输出被替换命令修改过的行, n和p连用
sed -n 's/test/trial/p' test.txt
将匹配后替换的行保存到指定文件中
sed 's/test/trial/w 保存到文件' 被修改文件
替换类似文件路径的字符串会比较麻烦,需要将路径中的正斜线进行转义
sed 's/\\/bin\\/bash/\\/bin\\/csh/' /etc/passwd
-
删除命令d
删除文本中的特定行,在默认情况下 sed 并不会修改原始文件,这里被删除的行只是从 sed 的输出中消失了,原始文件没做任何改变
删除第三行
sed '3d' 被修改文件
-
添加命令a 和 i
a 命令表示在指定行的后面附加一行,i 命令表示在指定行的前面插入一行
将newline插入到第三行下方
sed '3i\\newline' 被修改文件
-
替换命令c
c 命令表示将指定行中的所有内容,替换成该选项后面的字符串
s是每行的匹配项替换,c是把指定行替换
把第三行替换成newLine
sed '3c\\newLine
-
转换命令y
转换命令是唯一可以处理单个字符的 sed 脚本命令
基本格式 inchars长度必须和outchars长度相同
y/inchars/outchars/
inchars 模式中指定字符的每个实例都会被替换成 outchars 模式中相同位置的那个字符
转换命令是一个全局命令
echo "This 1 is a test of 1 try." | sed 'y/123/456/' This 4 is a test of 4 try
flags
flags 标记 | 功能 |
---|---|
p | 会打印与替换命令中指定的模式匹配的行。此标记通常与 -n 选项一起使用。 |
g | 对数据中所有匹配到的内容进行替换,如果没有 g,则只会在第一次匹配成功时做替换操作。例如,一行数据中有 3 个 A,则只会替换第一个 A; |
n | 1~512 之间的数字,表示指定要替换的字符串出现第几次时才进行替换,例如,一行中有 3 个 A,但用户只想替换第二个 A,这是就用到这个标记; |
w file | 将缓冲区中的内容写到指定的 file 文件中; |
& | 用正则表达式匹配的内容进行替换; |
\\n | 匹配第 n 个子串,该子串之前在 pattern 中用 () 指定 |
\\ | 转义(转义替换部分包含:&、\\ 等) |
编译
高级语言编写的程序通过编译器转化成机器语言
并不是所有的语言都需要先编译再运行,如解释语言是读到该句就将该句编译成机器语言,而不需要在运行前进行编译
大多数程序都直接使用下面命令进行编译
./configure;
make
configure文件
此文件一般是放在源代码树下的一个可执行的shell文件
此文件任务是分析生成环境,多数程序都是可移植的,所以在不同的环境需要细微调整来生成源代码,同时检查系统是否已经安装必要的外部工具
此文件在检查和配置build程序时会输出许多相关信息
此文件生成几个新文件,最重要的是Makefile文件
Makefile文件
该文件由configure文件生成
该文件指导make命令如何生成可执行程序的配置文件
该文件描述了生成最后的可执行文件时各个部件之间的联系关系
make只会生成那些缺失了和错误的文件
打包好的源代码一般包含一个特殊的make目标文件install
install
该命令执行会在系统目录下安装最后生成的可执行文件
make
用于生成,make install
用于安装到系统中可执行程序通常会安装在/usr/local/bin中
软件一般在/usr/local下新建目录
一般在输出信息里可以知道它做了什么
shell脚本
权限
对于shell脚本而言,通常有两种类型的权限
755所有人可执行,700只能所有者执行
位置
自己使用的脚本一般建议放在~/bin目录下
全局用户使用的脚本建议放在/usr/local/bin下
ubantu系统在用户的
~/.bashrc
中加入了如果有~/bin
目录就将此目录加入PATH
环境变量的代码
vim
vim为脚本编写提供了许多帮助
以下命令皆为在vi的命令模式中输入
可以将这些命令放入/.vimrc文件(或/etc/.vimrc中)中就可以永久生效
命令 | 描述 |
---|---|
syntax on | 开启语法高亮 |
set syntax = sh | 开启语法高亮 |
set health | 将/xxx搜索到的单词高亮 |
set tabstop = 4 | 设置Tab键的空格长度 |
set autoindent | 开启自动缩进 |
here
输入一大段带有换行文本时,echo命令需要在每一行写,使用here式命令可以简化
格式
command为可以接收标准输入的命令
token为结尾标识符
<<-
可以忽略开头的tab字符
command << token
简化echo
-
echo
echo "i am first line" echo "i am second line"
-
here,xxx为标识这一段文件截止的标志
xxx必须在一行单独出现,并且文本行的末尾没有空格,常用
_EOF_
表示结尾标志cat << xxx i am first line i am second line xxx
变量
直接使用
变量名=值
来声明变量注意变量名,=,值之间不能有空格
用
$变量名
引用变量
a=10
echo $a
变量的赋值
a=z; #将字符串"z"赋值给变量a
b="z z" #如果字符串带有空格则需要用""包裹
c="z z $a" #变量扩展
c="z z ${a}" #建议采用这种变量扩展方式
d=$(ls -l /) #命令扩展,将命令结果作为值
e=$((5*7)) #算数扩展
f=10 g=11 #可在一行内给多个变量赋值
函数
函数有两种声明方式
函数必须在调用前声明
第一种声明方式
function name {
echo "i am function"
return
};# 直接使用函数名调用函数
name
第二种声明方式
name() {
echo "ls -l /"
return
}# 将函数的结果作为命令执行
$(name)
局部变量
local a
a=10
if分支语句
基本格式
if会判断commands命令的退出状态
if commands; then
commands
elif commands; then
commands
else
commands
fi
x=5if [$x = 5]; then
echo "x=5"
else echo "x!=5"
fi
退出状态
在shell中,任何程序包括我们写的的脚本,在执行完毕后会向操作系统发送一个0~255之间的值,称之为退出状态,用于指示命令成功还是失败
按照惯例,0表示成功,其他值表示失败
shell提供了
$?
来检测退出状态值
true
命令总是返回0
false
命令总是返回1
ls -d /usr
#/usr
echo $?
#0
ls -d /unexistDirectory
#ls: 无法访问'/a': 没有那个文件或目录
echo $?
2
test
test用于测试表达式
以下两种方式等价
第一种更加流行
test [express]
test express
文件表达式
表达式 | 为true条件 |
---|---|
file1 -nt file2 | file1比file2新 |
file1 -ot file2 | file1比file2旧 |
-c file | file存在并且是一个字符(设备)文件 |
-d file | file存在并且是一个目录 |
-r file | file文件存在并且当前用户可读 |
-w file | file存在并且当前用户可写 |
-x file | file存在并且当前用户可执行 |
-e file | file存在 |
-f file | file存在并且是一个普通文件 |
file1 -ef file2 | 这两文件通过硬链接指向同一个文件 |
-b file1 | file1是块(设备)文件 |
-g file | file存在并且设置了组ID |
-G file | file存在且属于有效组ID |
-k file | file存在且有’粘滞位’属性 |
-L file | file存在并且是一个符号链接 |
-O file | file存在且属于有效用户ID |
-p file | file存在并且是一个命名管道 |
-s file | file存在并且长度大于0 |
-S file | file存在并且是一个网络套接字 |
-t file | file是一个定向到终端的/从终端定向的文件描述符,可用来标准输入/输出/错误是否被重定向 |
以上表举例
FILE=/etc/profile
# 注意,-f ,$FILE 必须和[]有一个空格的间距
if [ -f $FILE ]; then
echo "profile is a ordinary file"
#建议将$FILE加上"",这可以防范FILE为空时产生的错误
elif [ -d "$FILE" ]; then
echo "profile is a directory"
fi
#exit接受一个可选参数,它将成为程序的退出状态,默认是0,exit可替换为return
exit
字符串表达式
表达式 | 为true的条件 |
---|---|
string | 字符串不为空 |
-n string | 字符串的长度大于0 |
-z string | 字符串的长度等于0 |
string1==string2 | 字符串1等于字符串2,也可以用= 代替== |
string1!=string2 | 字符串1不等于字符串2 |
string1>string2 | 在使用此test表达式时,<要用\\< 转义,否则会被当成重定向符,此比较符以ASCII码排序比较 |
string1<string2 | 同上 |
以上表举例
s=mystring
if [ "$s" \\> "mystring2" ]; then
echo "i am impossible"
else
echo "i am certainly"
fi
return 0
整数表达式
表达式 | 成为true的条件 |
---|---|
num1 -eq num2 | num1和num2相等 |
num1 -ne num2 | num1和num2不相等 |
num1 -le num2 | num1小于等于num2 |
num1 -lt num2 | num1小于num2 |
num1 -ge num2 | num1大于等于num2 |
num1 -gt num2 | num1大于num2 |
更现代的test
[[express]]
语法,此命名和test很像,不过支持了一个很好的特性,字符串正则表达式
[[express]]
-
字符串正则表达式特性,注意, ~和正则表达式之间必须要有一个空格
string=~ regex
正则小案例,检测变量是不是数字
INTEGER=-5 if [[ "$INTEGER" =~ ^-?[0-9]+$ ]]; then echo "is a number" else echo "is not a number" fi
-
操作符支持匹配模式
操作符小案例,检测文件是否以test开头
FILE=/etc/profile if [[ $FILE == test.* ]]; then echo "is test.xxx" else echo "is not test.xxx" fi
((express))
为算数运算判断而生
if ((1 > 2)); then
echo "it is impossible"
fi
if (( ((5%2)) == 0 )); then
echo "i am impossible too"
逻辑表达式
Operation | test | [[]]和(()) |
---|---|---|
AND | -a | && |
OR | -o | || |
NOT | ! | ! |
-
[[]]和(())
INT=10 if [[ $INT -ge 5 && $INT -le 20 ]]; then echo "5 < INT < 20" fi
-
test
INT=10 if [ $INT -ge 5 -a $INT -le 20 ]; then echo "5 < INT < 20"
利用||
&&
来实现分支
同一些编程语言一样
&&前一个为真才执行后一个
||前一个为真则不执行后一个
command1 && command2
读取键盘输入
read
从标准输入读取值
语法
options为下表的选项,而variable则为接收输入的变量
read [options] [variable...]
options
选项 | 描述 |
---|---|
-a array | 将输入值从索引值为0处开始赋值给array |
-d delimiter | 用字符串delimiter的第一个字符标志输入的结束,而不是新一行的开始 |
-e | 使用Readline处理输入,此命令使用户能使用命令行模式的相同方式编辑输入 |
-n num | 从输入中读取n个字符,而不是读取一整行 |
-p prompt | 使用prompt字符串提示用户进行输入 |
-r | 原始模式,不能将\\ 字符翻译成转义 |
-s | 保密模式,输入不可见 |
-t seconds | 在seconds秒后结束输入 |
-u fd | 从文件说明符fd中读取输入,而不是从标准输入中读取 |
read读取数字判断大小
# -n表示不输出行尾的换行符
echo -n "please enter an integer"
read number
#表示number要比5大才为true,也可写为[[ $number -ge 5 ]],或者(( $number > 5 ))
if [ $number -ge 5 ]; then
echo "number is greater than 5"
fi
IFS间隔输入
通常shell会使用空格作为分隔符来赋值给多个变量
LFS是一个变量,默认是空格,用来表示read的分割符
如下面的程序会将na赋值给user变量,123456赋值给pw变量,1023赋值给uid
IFS=":" read user pw uid <<< "na:123456:1023"
read不可重定向问题
下面这段代码看似可以实现提取功能,实则不行
因为shell处理管道符的方式为管道会创建一个新的子shell环境,然后在子shell环境中执行,然后销毁子shell环境,read所赋值的变量也随之销毁
IFS=":"
echo "na:123456:1023" | read user pw uid