Skip to content

《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命令管理服务,原来是用servicechkconfig等命令

服务管理命令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命令执行分四步:

  1. 如果命令前面带路径,直接执行这个命令
  2. 检查这个命令是否是别名
  3. 检查这个命令是shell内建命令还是外部命令,如果是内建命令,直接执行
  4. 到PATH变量里查找命令的位置

Vim

远离vim

shell脚本

shell中常用命令和变量

  • read -p 'info' val
  • seq 1 10
  • expr 10+10expr length 'This is a test'
  • let i+=8
  • id user
  • $RANDOM
  • $USER

如何执行一个脚本文件

  • bash 脚本.shsh 脚本.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小时执行一次