《linux就该这么学》笔记
参考《Linux就该这么学》,这本书编得挺乱,看完shell脚本就没再看了。
linux的一些约定
命令格式
Linux的命令参数分长格式和短格式,例如--help和-h,其中,长格式的参数不能合并,短格式的参数可以合并,例如$ ps -a -u -x可以写成$ ps -aux。
一些特殊的文件
- /dev/null
- /dev/zero
配置Linux环境
包管理器
RPM和Yum:
RPM是RHEL系列发行版(包括RHEL、CentOS等)的包管理器
Yum是RHEL系列发行版的软件仓库
yum的软件源配置文件在这里:/etc/yum.repos.d/
Yum常用命令:
yum install [-y] 软件包名选项“-y”会使安装过程对所有的询问都选择“yes”yum update 软件包名yum remove 软件包名yum search 软件包名在软件仓库中搜索这个软件yum repolist查看系统中所有的软件源
系统初始化进程systemd
linux的开机过程是这样的,从BIOS开始,然后进入Boot Loader,再加载系统内核,内核初始化,最后启动系统的初始化进程。系统初始化进程是系统启动后的第一个进程,centos7使用systemd代替原来的System V init作为新的系统初始化进程。
systemd使用target代替了System V inti中的运行级别。
centos7使用systemctl命令管理服务,原来是用service、chkconfig等命令
服务管理命令systemctl
system start 服务名system restart 服务名system stop 服务名system status 服务名,查看服务状态system reload 服务名,重新加载配置文件(不终止服务)
Linux常用命令
man命令
| 功能 | 按键 |
|---|---|
| 向下翻页 | Page Down,空格 |
| 向上翻页 | Page Up,b |
| 回到首页 | Home |
| 翻到最后一页 | End |
| 搜索(从上往下) | /关键字 |
| 搜索(从下往上) | ?关键字 |
| 查看下一个搜到的关键字 | n |
| 查看上一个搜到的关键字 | N |
常用命令
| echo | - |
|---|---|
| 功能 | 在终端打印文本 |
| 用法 | $ echo [字符串/$变量] |
| 说明 | 字符串可以用成对的单引号或双引号包围起来;变量可以用{}包围起来 |
| 例子 | $ echo abc"erf"df 输出 abcerfdf,$ echo abc"e'rf"df 输出 abce'rfdf |
| date | - |
|---|---|
| 功能 | 显示系统时间或日期 |
| 用法 | $ date [参数] [date字符串/+格式] |
| 参数 | -s是设置系统时间;-d是显示date字符串所表示日期的详细信息 |
| 例子 | $ date,$ date "+%Y-%m-%d %H:%M:%S",$ date -d "2020",$ date -d "now",date -s "20170901 8:30:00" |
| reboot | - |
|---|---|
| 功能 | 重启系统 |
| 用法 | $ reboot |
| poweroff | - |
|---|---|
| 功能 | 关机 |
| 用法 | $ poweroff |
| wget | - |
|---|---|
| 功能 | 通过URL下载文件 |
| 用法 | $ wget [参数] 下载地址 |
| 参数 | -b后台下载;-P下载到指定目录;-p下载页面内所有资源;-r递归下载;-O输出文件名 |
| 例子 | $ wget -r -p http://www.linuxprobe.com |
| ps | - |
|---|---|
| 功能 | 查看系统进程 |
| 用法 | $ ps [参数] |
| 参数 | -a列出所有进程(包括其他用户的,包括root等用户);-u显示用户及其他信息;-x列出没有用户终端的进程 |
| 例子 | $ ps -axu |
-u参数输出的字段 |
USER:用户、PID:进程ID、%CPU:CPU占用率、%MEM:内存占用率、VSZ:虚拟内存占用(KB)、RSS:常驻内存占用(KB),TTY:所在终端,STAT:进程状态,START:启动时间,TIME:实际的CPU占用时间,COMMAND:命令 |
linux进程状态码: - R:正在运行或可运行(在运行队列中) - S:可中断的睡眠状态(通常是在等待事件) - D:不可中断的睡眠状态(通常是在I/O) - T:暂停(ctrl+z) - t:被跟踪(debug) - Z:僵尸进程(程序执行完毕,task_struct还留着,里面保存程序的退出码和其他统计信息) - X:正在被销毁(非常短暂) - W:正在换页(2.6内核以后已经弃用了)
状态描述信息 - <:高优先级 - N:低优先级 - L:有页被锁定在内存中(实时和定指I/O) - s:session leader - l:多线程 - +:在前台进程组中
| top | - |
|---|---|
| 功能 | 动态地监视进程活动与系统负载等信息 |
| 用法 | $ top |
| 输出信息 | |
| - 开头几行是系统总的信息 | |
| - PR:优先级 | |
| - VIRT:虚拟内存使用量 | |
| - RES:常驻内存大小 | |
| - SHR:共享内存大小 |
| pidof | - |
|---|---|
| 功能 | 查看系统进程 |
| 用法 | $ pidof 进程名 |
| 例子 | $ pidof wget |
| kill | - |
|---|---|
| 功能 | 杀死进程 |
| 用法 | $ kill [参数] 进程ID |
| 例子 | $ kill 9821 |
| killall | - |
|---|---|
| 功能 | 终止某个指定名称的服务所对应的全部进程 |
| 用法 | $ killall [参数] 进程名 |
| 说明 | 如果用pidof能查出好多进程ID,就可以用killall杀死这些进程 |
系统状态检测
ifconfig
| uname | - | - |
|---|---|---|
| 功能 | 查看内核信息 | |
| 用法 | $ uname -a |
输出全部信息,按以下顺序排列 |
| 内核名 | $ uname -s |
Linux |
| 主机名(节点名) | $ uname -n |
linuxtest |
| 内核发行版本 | $ uname -r |
3.10.0-862.el7.x86_64 |
| 内核版本 | $ uname -v |
#1 SMP Fri Apr 20 16:44:24 UTC 2018 |
| 机器硬件名 | $ uname -m |
x86_64 |
| 处理器类型 | $ uname -p |
x86_64 |
| 硬件平台 | $ uname -i |
x86_64 |
| 操作系统 | $ uname -o |
GNU/Linux |
查看系统发行版信息
- $ lsb_release -a
- $ cat /etc/redhat-release
uptime:查看系统负载
显示系统在最近1分钟、5分钟、10分钟内的压力情况,数值越小压力越小
free:查看系统内存使用情况
who:查看当前登录系统的所有用户
输出顺序:用户名 终端 登录时间
last:查看系统的所有登录记录
| history | - |
|---|---|
| 功能 | 查看用户的历史命令 |
| 用法 | $ history [-c] |
| 说明 | 参数-c可以清空历史记录,历史记录被保存在用户目录下的.hash_history文件中,/etc/profile中的HISTSIZE变量定义了最多能保存多少条历史命令 |
$ cat ~/.bash_history |
直接查看日志文件,但是这个文件中的日志可能不是最新的,不如history命令靠谱 |
$ !数字编号 |
再次执行对应history编号的历史命令 |
目录命令
略
文件编辑
| cat | - |
|---|---|
| 功能 | 查看文本文件 |
| 用法 | $ cat [选项] 文件 |
| 说明 | 选项-n表示输出文件时显示行号 |
| more:查看长文本文件 | |
| 空格键翻页,回车键看下一行 |
| head和tail | - |
|---|---|
| 功能 | 查看文件文件的开头若干行和结尾若干行 |
| 用法 | $ head -n 20 文件、$ head -10 文件、$ tail -n 5 文件、$ tail -5 文件 |
| 用法2 | $ tail -f 文件可以实时显示文件的更新 |
| tr | - |
|---|---|
| 功能 | 将字符替换后输出替换后的文本。有两种模式,交互模式和非交互模式 |
| 用法1 | $ tr [a-z] [A-Z] |
| 用法2 | $ echo "Hello World" | tr [a-z] [A-Z]、$ cat test.txt | tr [a-z] [A-Z] |
| 说明 | 用法1会进入交互模式,用户需要输入一行字符,tr会输出一行转换结果。用法2中tr会直接将转换后的字符输出 |
| wc | - |
|---|---|
| 功能 | 统计文本的行数、单词数、字节数 |
| 用法 | $ wc [选项] [文件] |
| 例如 | $ wc -l test.txt |
| 说明 | 选项-l统计文件的行数,选项-w统计文件的单词数,选项-c统计文件的字节数。可以利用-l统计一些系统信息 |
stat:显示文件详细信息
输出某个文件详细的信息,包括存储、权限、时间等信息
| cut | - |
|---|---|
| 功能 | 按列提取一个文本文件的内容 |
| 用法 | $ cut [选项] [文件] |
| 例如 | $ cut -f1 -d" " .bash_history |
| 说明 | 用-f指定提取第几列,用-d指定单词分隔符,如果某行文本没有指定的列,就是输出空行 |
| diff | - |
|---|---|
| 功能 | 比较多个文本文件之间的文件内容的差异 |
| 用法 | $ diff [选项] 文件1 文件2 |
| 例如 | $ diff --brief txt1 txt2 |
| 说明 | 选项--brief仅当两个文件不同时报告给用户,选项-c输出具体的区别,不加选项会输出介于两者之间的信息 |
目录管理
| touch | - |
|---|---|
| 功能 | 创建文件、修改文件属性 |
| 用法 | $ touch [选项] [文件名] |
| 说明 | 没有选项时会创建一个空文件,如果文件已存在则什么都不会发生(会修改文件的时间戳) |
mkdir
-p选项可以创建多层目录,例如$ mkdir -p test/t1/t2。
cp
使用$ cp -r dir1 dir2这个命令时,如果dir2内存在一个和dir1同名的目录,则dir1会和其合并,此时即使加上-i也没用。
mv(不需要-r)
rm
-r删除目录,-f强制删除(系统不会发出确认),并且忽略不存在的文件。$ rm -rf /
| dd | - |
|---|---|
| 功能 | 按块大小和块数拷贝文件 |
| 用法 | $ dd [选项] [文件名] |
| 例子 | $ dd if=/dev/zero of=test count=3 bs=120M |
| 说明 | if指定了输入文件,of指定了输出文件,count指定了块个数,bs指定了块大小;/dev/zero是一个特殊的文件,这个文件不占存储空间,但是可以作为数据输入,源源不断地提供数据(有点和/dev/null相对的意思) |
file:查看文件类型
常见的有,“data”、“UTF-8 Unicode text”、“ASCII text”、“block special”、“character special”等等。
打包和压缩
| tar | - |
|---|---|
| 功能 | 打包和压缩文件,tar通常用来生成.tar、.tar.gz和.tar.bz2格式的文件,.tar是仅打包,.tar.gz和.tar.bz2是压缩后再打包 |
| 用法 | $ tar [选项] [文件名] |
| 选项说明 | -c/-x:压缩/解压,-z:用gzip压缩/解压,-j:用bzip2压缩/解压,-v:显示输出,-f:指定目标文件名,-t:查看包内有哪些文件,-p:保留原始的权限和属性,-P:文件名使用绝对路径,-C:解压到指定目录 |
| 例如 | 压缩一个文件:$ tar -zcf test.tar.gz test,解压一个文件:$ tar -zxvf test.tar.gz或$ tar -zxvf test.tar.gz -C /home/swj |
搜索
| grep | - |
|---|---|
| 功能 | 搜索文本 |
| 用法1 | $ grep [选项] 字符串 文件名 |
| 用法2 | $ 输出 | grep [选项] 字符串 |
| 选项说明 | -b:将二进制文件当文本文件搜索,-c:仅显示找到的行数,-n:显示行号,-i:忽略大小写,-v:反向搜索(搜索不包含指定字符串的行) |
| 例子 | 查看不允许登录的用户:$ grep /sbin/nologin /etc/passwd |
| find | - |
|---|---|
| 功能 | 搜索文件 |
| 用法 | $ find [查找路径] 查找条件 操作 |
| 例子 | $ find /etc -name *host* [-print] |
| 选项说明 | -exec [命令] {} \;这个操作值得一提,{}指代find命令搜索出来的每个文件,例如find /etc -name "host*" -exec ls -l {} \;这个命令会将搜出来的文件的详细信息打印到屏幕上,注意,-exec操作的结尾是\;,一定要带上分号 |
命令
重定向、管道、通配符、转义字符、环境变量
输入输出重定向
输入输出重定向是指把输入输出定向到其他文件。
linux标准输入出输出:
- 标准输入:STDIN,文件描述符0,/dev/stdin
- 标准输出:STDOUT,文件描述符1,/dev/stdout
- 标准错误输出:STDERR,文件描述符2,/dev/stderr
写法:
# 输入重定向
wc -l <test.txt
# 输出重定向
echo hello >test.txt # 覆盖
echo hello >>test.txt # 追加
echo hello 2>test.txt # 重定向错误输出时必须加上文件描述符
echo hello 2>>test.txt
# 同时重定向多种输入输出
命令 <文件1 >文件2
命令 >>文件1 2>文件2
# 合并标准输出和标准错误
命令 >文件 2>&1
命令 &>文件
命令 &>>文件
# 从标准输入读取两个tag之间的内容,第二个tag必须另起一行顶格写,tag可以是个字符串。
# 例如:下面这个例子中123是一个tag
wc -l << 123
> Hello
> world!
> 123
管道
管道符'|'将上一个命令的输出作为下一个命令的输入。
用法:
# 把一大堆输出拼在more命令后面,翻页查看
ls -la / | more
# 非交互式修改用户密码
echo '123456' | passwd --stdin user002 # 不适用于ubuntu/debian
echo 'user003:123456' | chpasswd
# 给sudo传递密码,sudo的-S选项支持从标准输入读取密码(-S等同于--stdin)
echo `password` | sudo -S cmd
通配符(正则)
(通配符实际上和shell正则表达式有关)以下是常用通配符
| 通配符 | 含义 | 例子 |
|---|---|---|
| * | 匹配0个或多个字符 | |
| ? | 匹配1个字符 | |
| [] | 匹配指定字符范围内的任意单个字符 | [abc] |
| [0-9]、[a-z]、[A-Z] | 匹配范围内的任意单个字符 | |
| [a-Z] | 所有大小写字母 | |
| !或^ | 匹配范围外的字符 | [!0-9]、[^abc] |
转义字符
常用转义字符
| 转义字符 | 含义 |
|---|---|
| \ | 将一个特殊字符转为普通字符 |
| ' ' | 单引号包围的内容都被视为普通字符 |
| " " | 双引号包围的内容大部分是普通字符,少数字符保留了特殊含义,如$、\、`等 |
| ` ` | 反引号包围的内容是一个命令,其功能是获取命令执行后得到的输出 |
环境变量
- alias命令:查看和设置命令的别名
alias:查看所有别名alias 名字:查看这个名字是否是其他命令的别名alias 名字=命令:给命令设置别名- type命令:查看命令的类型,例如
type cd - env命令:查看系统中所有环境变量
linux命令执行分四步:
- 如果命令前面带路径,直接执行这个命令
- 检查这个命令是否是别名
- 检查这个命令是shell内建命令还是外部命令,如果是内建命令,直接执行
- 到PATH变量里查找命令的位置
Vim
远离vim
shell脚本
shell中常用命令和变量
read -p 'info' valseq 1 10expr 10+10、expr length 'This is a test'let i+=8id user$RANDOM$USER
如何执行一个脚本文件
bash 脚本.sh或sh 脚本.sh- 给脚本加上执行权限,输入路径执行
用户参数
$#:参数总数$0:脚本名$*:所有参数值$1、$2、$3...:对应位置的参数$?:上一个命令的退出码(数字)
逻辑运算符
命令1 && 命令2:命令1执行成功才会执行命令2命令1 || 命令2:命令1执行失败才会执行命令2[! xxx] && 命令1:对条件表达式的值取反
和用户交互
- read命令,例如,
read -p "Enter your score:" GRADE,读取用户输入并保存到GRADE变量中,-p选项用于向用户显示提示信息。
shell例子
#!/bin/bash
$(命令) # 取命令的执行结果,类似于转义字符``
# 条件表达式两边一定要有空格,条件为真返回0,否则返回非0
# 文件判断
[ -e /data/test ] # 判断文件或目录是否存在
[ -f /data/test ] # 判断是否为文件
[ -d /data/test ] # 判断是否为目录
[ -r /data/test ] # 判断当前用户对文件是否有读权限
[ -w /data/test ] # 判断写权限
[ -x /data/test ] # 判断执行权限
# 整数比较
[ 10 -eq 10 ] # 等于
[ 10 -ne 10 ] # 不等于
[ 10 -gt 10 ] # 大于
[ 10 -lt 10 ] # 小于
[ 10 -ge 10 ] # 大于等于
[ 10 -le 10 ] # 小于等于
# 字符串
[ -z $String ] # 字符串是否为空
[ str1 = str2 ] # 相同
[ str1 != str2 ] # 不相同
# if
if [ xxx ]
then
...
elif [ xxx ]
then
...
else
...
fi
# 分号用于在单行内分隔代码块
if [ xxx ] ; then
...
elif [ xxx ] ; then
...
else
...
fi
# for循环
for 变量名 in 取值列表
do
...
done
# 几种for循环的例子
for val in `cat test.txt`
for i in $(seq 1 10)
for i in {1..10}
for ((i=1;i<=10;i++))
for i in $*
# while循环
while 条件
do
...
done
# while例子
while true
# case
case 变量 in
模式1)
...
;;
模式2)
...
;;
*
...
esac
定时任务
# 创建和编辑定时任务
crontab -e
# 查看定时任务
crontab -l
# 删除定时任务
crontab -r
# 编辑其他人的定时任务(管理员)
crontab [-u user]
# 定时任务格式
# 分 时 日 月 星期 命令,没有设置的字段用*占位,可以用逗号提供多个时间点,用横杠表示一段时间
# 每个时间点后面跟一个斜杠+数字可以定义频率
# 命令必须使用绝对路径
# 每个定时任务占一行
# 例子
25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot
25 3 12-15 * * /usr/bin/tar -czvf backup.tar.gz /home/wwwroot
25 */3 * * * /usr/bin/tar -czvf backup.tar.gz /home/wwwroot # 每隔3小时执行一次