Appearance
Linux
注意:需要开启虚拟化
- 确认 Windows 服务当中的虚拟化有没有开 - 扩展资料
- BIOS 设置虚拟化打开 - 问百度
- 如何查看虚拟化是否成功开启: LeoMoon/securable
Linux导论
Linux概述
Linux 是基于 Unix 的开源、免费、多用户、多任务的操作系统,由于系统的稳定性和安全性。几乎成为程序代码运行的最佳系统环境。
Windows的不足
- Windows 是需要花钱去购买
- 系统长时间运行,安装软件多了,系统越来越慢,越来越不稳定。
- 病毒和流氓软件很多
Linux的优势
- Linux 系统是免费,很多还是开源的。
- 长时间运行,很稳定的
- 几乎没有病毒和流氓软件
Linux的发展
Linux 最初是由芬兰赫尔辛基大学 学生 Linus Torvalds 开发的,由于自己不满意教学中使用的 MINIX 操作系统,所以在 1990 年底由于个人爱好设计出了 Linux 系统核心。
后来发布于芬兰最大的 ftp 服务器上,用户可以免费下载,所以它的周边的程序越来越多,Linux 本身也逐渐发展壮大起来,之后 Linux 在不到三年的时间里成为了一个功能完善,稳定可靠的操作系统。
Linux的分类
用户界面支持程度
图形界面版
服务器版
原生程度
内核版本
发行版本
安装虚拟机软件并创建虚拟机 - VirtualBox
安装虚拟机软件
VirtualBox
VMWare
step 1
step 2
step 3
step 4
step 5
step 6
step 7
step 8
创建虚拟机
step 1
step 2
step 3
step 4
step 5
step 6
step 7
CentOS虚拟机配置
step 1
step 2
step 3
step 4
step 5
step 6
step 7
安装CentOS 7
step 1
step 2
step 3
step 4
step 5
step 6
step 7
step 8
注意
两个网卡做同样的设置
step 9
注意
两个网卡做同样的设置
step 10
step 11
step 12
step 13
启动CentOS 7
step 1
step 2
step 3
step 4
获取CentOS IP地址
在虚拟机登录CentOS,输入以下命令
- ifconfig
- ip addr
安装虚拟机软件并创建虚拟机 - VMWare
安装虚拟机软件
step 1
step 2
step 3
step 4
step 5
step 6
step 7
step 8
step 9
step 10
点击许可证,将许可证粘贴至窗口
step 11
step 12
双击启动虚拟机软件
创建虚拟机
step 1
step 2
step 3
step 4
step 5
step 6
step 7
step 8
step 9
CentOS虚拟机配置
step 1
step 2
step 3
step 4
step 5
step 6
安装CentOS 7
与VirtualBox安装方式一致,但VMWare虚拟机安装CentOS 7只需要配置一张网卡
获取CentOS IP地址
与VirtualBox获取方式一致,但VMWare虚拟机获取的IP地址只有一个。使用虚拟机软件连接时,连接的就是这个网址。
查看CentOS 版本号
cat /etc/redhat-release
使用客户端连接Linux
软件下载和安装
- 无需安装,直接解压就可以使用
客户端连接服务器
- 点左上角的 Session 创建一个会话连接
- 在如下窗体中进行会话的设置
- 第 1 次连接,需要输入密码
使用客户端传输文件
做个快照
Linux 入门
Linux 目录结构
与 Windows 操作系统不同,Windows 中最上面是盘符。在 Linux 中没有盘符概念,最顶层是根目录/。
常用目录 | 说明 |
---|---|
root | 管理员所在目录 |
home | 普通用户的主目录 |
bin | 所有的命令可执行文件所在目录 |
etc | 系统配置文件所在的目录 |
usr | Unix Share Resource,资源目录,很多软件就安装在这个目录下 |
Linux命令提示符
目录操作命令【重点】
【重点】cd [OPTION] [DIR]
Change the current directory to dir, 切换当前路径
dir
.
当前目录
..
上一级目录
~
用户主目录
上一次的目录
操作演示
切换到系统根目录
texcd /
切换到该目录下 usr 目录
texcd usr
切换到上一层目录
texcd ..
切换到用户主目录,如果是 root 管理员,则是到 root 目录
texcd /root 或: cd ~
切换到上一个所在的目录
texcd -
【重点】mkdir [OPTION] DIRECTORY
Make directories, 创建目录
操作演示
进入 root 目录
texcd /root
在 root 目录下创建 aaa 目录
texmkdir aaa
使用.方式的相对路径,在当前目录下创建 bbb 目录
texmkdir ./bbb
在 root 目录下,在 bbb 目录下创建 ccc 目录
texmkdir bbb/ccc
使用..在上一级目录下创建 eee 目录
texmkdir ../eee
使用绝对路径在 root 下创建目录 fff 目录
texmkdir /root/fff
【重点】ls [OPTION] [FILE]
List directory contents, 显示目录内容
参数
-l
以详细的方式显示文件和目录。ls -l可以缩写成ll
-a
显示所有的文件和目录包含隐藏的文件和目录
隐藏的文件和目录以 . 开头
操作演示
进入 root 目录,以精简形式查询当前目录下的内容
texcd ~ ls
以详细形式查询当前目录下的内容,可以缩写成 ll
texls -l
在当前目录下创建一个隐藏的目录.ccc
texmkdir .ccc
以精简形式查询当前目录下的所有的内容,包含隐藏文件
texls -a
以详细形式查询当前目录下的隐藏内容,-la 和-al 都可,也可以使用 ll -a
texls -al ls -la ll -a
第一列字母含义
字母 | 含义 |
---|---|
d | directory, 目录 |
- | 文件 |
l | 链接,类似快捷方式 |
文件列表含义
Linux配色说明
颜色 | 说明 |
---|---|
白色 | 普通文件 |
深蓝色 | 目录 |
绿色 | 可执行文件 |
红色 | 压缩包 |
青色 | 链接,类似于快捷方式 |
橙色 | 设备文件 |
【重点】
find <PATH> [-name PATTERN]
search for files in a directory hierarchy, 搜索目录树上的所有文件
参数
-name pattern
指定要查询的字符串
* 匹配多个字符
? 匹配 1 个字符
-exec utility [argument ...] ;
True if the program named utility returns a zero value as its exit status. Optional arguments may be passed to the utility. The expression must be terminated by a semicolon (
;''). If you invoke find from a shell you may need to quote the semicolon if the shell would otherwise treat it as a control operator. If the string
{}'' appears anywhere in the utility name or the arguments it is replaced by the pathname of the current file. Utility will be executed from the directory from which find was executed. Utility and arguments are not subject to the further expansion of shell patterns and constructs.-exec utility [argument ...] {} +
Same as -exec, except that ``{}'' is replaced with as many pathnames as possible for each invocation of utility. This behaviour is similar to that of xargs(1).
操作演示
在/root 目录下,查询当前目录下所有的文件和目录
texcd /root find -name "*"
查询/根目录下(包括子目录),名以 abc 开头的目录和文件
texcd / find -name "abc*"
查询根目录即其子目录下以 cc 开头的三个字符的目录或文件
texcd / find -name "cc?"
查询 markdown 文件,并搜索
future.weaver
texfind . -name '*.md' -exec grep -H -n 'future\.weaver' {} \;
查询 markdown 文件,并将其中的
future.weaver
替换为futureweaver
texfind . -name '*.md' -exec sed -i "" 's@future\.weaver@futureweaver@g' {} \;
mv [OPTION] SOURCE DEST
move (rename) files, 移动、重命名文件或目录
操作演示
将 root 文件夹下的 aaa 目录改成 abc
texcd ~ mv aaa abc
使用 touch 创建一个空文件为 aaa,再使用 mv 将 aaa 文件改名为 xyz
textouch aaa mv aaa xyz
将 root 下的 xyz,移动到系统根目录下
texmv xyz /
cp [OPTION] SOURCE DEST
copy files and directories, 复制文件或目录
参数
- -r 递归复制目录,连同子目录一起复制,recursive
操作演示
当前是 root 目录,复制/proc/dma 文件到 root 目录下的 bbb 目录中
texcp /proc/dma ./bb
将/etc 目录下所有 c 开头的文件复制到 root 目录下的 bbb 目录下
texcp -r /etc/c* /root/bbb
将/etc 目录下所有 h 开头的文件和目录复制到 root 目录下的 eee 目录,连同子目录下的内容一起复制
texcp -r /etc/h* /root/eee
rm [OPTION] FILE
remove files or directories, 移除文件或目录
参数
- -r, 递归地移除目录中的内容。recursive
- -f, 忽略不存在的文件,并且从不向用户提示。force
操作演示
同时删除 eee 目录下的 hostname 和 hosts 文件
texrm hostname hosts
进入 root 下的 bbb 目录,删除所有文件名 csh,任意扩展名的文件
texcd bbb rm csh.*
进入 root 目录下的 eee 目录,递归删除 httpd 目录和所有子目录的文件,不进行确认,强制删除。
texcd ~/eee rm -rf httpd
【常用】man
an interface to the on-line reference manuals, 在线参考手册
操作演示
- 查看 mkdir 命令的参考手册
- 查看 ls 命令的参考手册
【常用】info
Read documentation in info format,在线参考手册
操作演示
- 查看 cp 命令的参考手册
- 查看 mv 命令的参考手册
小结
切换当前路径
创建目录
显示目录内容
搜索文件
移动、重命名
复制
移除
查询帮助文档
文件操作命令【了解】
相关命令概要
cat [OPTION] [FILE]
concatenate files and print on the standard output, 显示文件内容
more [OPTION] FILE
file perusal filter for crt viewing,
在显示器上阅读文件的过滤,分页显示文件[Enter] 逐行显示
[Space] 逐页显示
[Q] 退出
head [OPTION] [FILE]
output the first part of files, 输出文件的开始部分
参数
- -n 显示指定的前 n 行,默认 10 行
tail [OPTION] [FILE]
output the last part of files, 输出文件的末尾部分
- -n 显示指定的后 n 行,默认 10 行
less [OPTION] [FILE]【常用】
opposite of more, 分页或翻页显示文件内容
参数
- -N 显示行号
[Ctrl + U]向上翻一页
[PageUp]向上翻一页
[Ctrl + D]向下翻一页
[PageDn]向下翻一页
[Q] 退出
touch [OPTION] FILE
change file timestamps,
修改文件的时间戳,创建一个文本文件,长度是 0 个字节
操作演示
将素材目录的 Demo.java 文件,上传到 root 目录下。
查看当前目录下 Demo.java 文件的全部内容
texcat Demo.java
分页查看当前目录下 Demo.java 文件内容,按回车键一行一行的看,按空格健一页一页的看
texmore Demo.java
查看当前目录下 Demo.java 文件的前 10 行内容
texhead Demo.java
查看当前目录下 Demo.java 文件的后 10 行内容
textail Demo.java
查看当前目录下 Demo.java 文件的前 5 行内容
texhead -n 5 Demo.java
查看当前目录下 Demo.java 文件的后 5 行内容
textail -n 5 Demo.java
使用 less 命令显示 Demo.java 文件,显示行号
texless -N Demo.java
小结
查看文件内容,不具备分页功能
查看文件内容,具备分页功能,但只能往后翻,不能往前翻
显示头的内容,默认显示 10 行
显示尾的内容,默认显示 10 行
查看文件内容,具备分页功能
创建一个新的空文本文件
vim文本编辑器【了解】
vim的三种模式
模式 | 说明 |
---|---|
命令模式 | 可以移动光标、删除字符等操作,打开文件时即进入这个模式 |
编辑模式 | 在此模式下可以输入字符,进行编辑等操作 |
底行模式 | 可以输入命令对编辑的文件进行查找,保存,退出等操作 |
vim三种模式的切换
vim命令
命令 | 描述 |
---|---|
i | 在光标的前面插入字符 |
a | 在光标的后面插入字符 |
o | 在光标的下一行插入字符 |
yy | 复制当前行 |
p | 如果之前已经复制了这个就可以粘贴 |
dd | 删除当前行 |
u | 撤销前面的操作undo |
/字符串 | 在内容中搜索指定的字符串 n:向后继续查找 N:向前继续查找 |
wq | 保存并退出 |
q! | 强制退出,不保存 |
wq! | 强制保存退出,用于只读文件 |
操作演示
vim Hello.java 用 vim 编辑器创建/打开 Hello.java 文件,这时进入命令模式。
按 i 键,进入编辑模式,输入以下内容:
javapublic class Hello { public static void main(String[] args) { System.out.println("Hello!"); } }
按 Esc 键,进入命令模式,按冒号进入底行模式
输入:wq 回车,表示存盘退出
使用 cat Hello.java 查看文件的内容
使用 vim 打开 Hello.java 文件,进入命令模式。
将光标移动到 System.out 这一行,按 yy 复制
按 3 次 p,粘贴这一行三次
javapublic class Hello { public static void main(String[] args) { System.out.println("Hello!"); System.out.println("Hello!"); System.out.println("Hello!"); System.out.println("Hello!"); } }
按 dd 删除最后一行
按 i 进入编辑模式
再任意输入一些内容
在按 Esc 进入命令,按冒号进入底行模式
输入 q!回车,不存盘强行退出。
使用 cat Hello.java 发现 Hello.java 没有变化
小结
yy
tex复制当前行
p
tex粘贴
dd
tex删除当前行
u
tex回退-undo
/字符串
tex搜索字符串
wq
tex保存并退出
q!
tex强制退出
压缩与解压命令【重点】
压缩文件扩展名
扩展名 | 分类 |
---|---|
.zip或.rar | 在windows下两种压缩文件格式 |
.tar | 在Linux下打包文件,不一定压缩 |
.gz | 在Linux下压缩文件 |
.tar.gz | 既打包又压缩 |
压缩与解压命令
tar
manipulate tape archives, 操作压缩文件
参数
- -c, --create, 压缩文件【重点】
- -v, --verbose, 详细显示处理的文件
- -z, --gzip, --ungzip, 用 gzip 对存档压缩或解压
- -f, --file [HOSTNAME:], 指定存档
- -x, --extract, --get, 从存档展开文件【重点】
- -C, --directory DIR, 转到指定的目录
zip [OPTIONS] [zipfile [file ...]]
package and compress (archive) files,压缩
- -v 打印详细信息
unzip zipfile
list, test and extract compressed files in a ZIP archive,解压
操作演示
定位于 root 目录,将当前目录下的 Hello.java 和 Demo.java 文件打包成 hello.tar 文件,并显示详细信息。
texcd ~ tar -cvf hello.tar Hello.java Demo.java
将当前目录下的 Demo.* 打包并压缩成 demo.tar.gz 文件,显示详细信息。
textar -zcvf demo.tar.gz Demo.*
定位于 root 目录下,删除所有大写的 Hello 开头的文件
texrm -rf Hello*
解压 hello.tar 到当前目录
textar -xvf hello.tar
释放 demo.tar.gz 文件到 abc 目录下
textar -zxv -f demo.tar.gz -C abc mv demo.tar.gz abc cd abc tar -zxvf demo.tar.gz
将当前目录下的 Demo.*打包并压缩成 demo.zip 文件,显示详细信息
bashzip -v demo.zip Demo.*
将当前目录下的 Demo.*删除,并从 demo.zip 解压文件
bashrm -rf Demo.* unzip demo.zip
小结
.tar
只打包,不压缩
.tar.gz
压缩
-zxcvf
如果遇到的文件是
tar.gz
的话,那么使用的参数,一定是zxcvf
如果是解压的话,删除
c
参数,因为c
参数是create,是压缩的含义如果是压缩的话,删除
x
参数,因为x
参数是extract,是解压的含义
zip
unzip
其它命令
pwd【重点】
print name of current/working directory, 显示当前工作目录
操作演示
- 进入根目录,显示当前的目录
- 进入/bin,显示当前的目录
- 进入/usr/bin 目录,显示当前的目录
ps【相对重点】
process status, 查看进程状态
Linux进程
- 操作系统启动的时候自动启动的进程
- 由用户在终端上(命令行中)输入的进程
Bash进程
- 每个用户登录以后都会分配一个终端操作的进程
- 这个进程是所有终端命令的父进程,不要随意终止这个进程
ps -aux
与ps -ef
的区别两者输出的结果大致相同,显示风格不同
参数
- -a, 显示所有用户在终端上启动的进程
- -u, 显示所有用户在终端启动的进程的详细信息
- -x, 显示所有用户启动的所有进程
- -e, 显示所有进程(包括用户进程和系统进程)
- -f, 显示详细信息
操作演示
在客户端中显示当前用户通过终端启动的所有进程
texps
在 Linux 命令行窗口运行 vim Hello.txt 编辑文件,显示所有用户通过终端启动的所有进程。
texps -a
显示所有用户通过终端启动的所有进程详细信息
texps -au
显示所有用户所有进程详细信息
ps -aux
输出说明
列标题 | 说明 |
---|---|
%CPU | CPU(处理器)使用百分比 |
%MEM | 真实内存使用百分比 |
CMD | 正被执行的命令的名称 |
COMMAND | 正被执行的命令的完整名称 |
PID | 进程ID |
PPID | 父进程的进程ID |
RSS | 内存驻留空间大小(内存管理) |
START | 定时启动的时间 |
STAT | 状态代码(O, R, S, T, Z) |
TIME | 积累CPU时间 |
TTY | 控制终端的完整名称(?表示没有控制终端,该进程为守护进程) |
USER | 用户名 |
VSZ | 虚拟大小(单位为KB) |
kill [-9] signal【相对重点】
terminate a process, 终止进程
参数
- -9 强行终止
操作演示
在 Linux 命令行上使用 vim 编辑 Hello.txt 文件
在 shell 客户端,显示所有用户通过终端启动的所有进程,并杀死 vim 这个进程。
在 Linux 命令行可以看到进程被终止
在 Linux 命令行使用 ping www.future-weaver.com
在 shell 客户端,显示所有用户通过终端启动的所有进程,并强行杀死 ping 这个进程
在 Linux 命令行可以看到进程被杀掉
grep [OPTIONS] PATTERN [FILE...]【重点】
print lines matching a pattern, 打印匹配给定模式的行
参数
- -n, --line-number, 在输出的每行前面加上它所在的文件中它的行号
- -v, --invert-match, 选择不匹配的行
- -i, --ignore-case, 忽略大小写
操作演示
在 Demo.java 中搜索 close 字符串
texgrep close Demo.java
在 Demo.java 中搜索 close 字符串,并且显示行号
texgrep close Demo.java -n
在 Demo.java 中搜索没有 close 的行和行号
texgrep close Demo.java -nv
在 Demo.java 中忽略大小写搜索 insert 字符串并且显示行号
texgrep insert Demo.java -ni
|【重点】
管道命令/重定向命令
语法
命令 1 | 命令 2
解释
将一个命令(命令 1)的执行结果做为另一个命令(命令 2)的条件输入
操作演示
分屏显示/etc 目录所有文件的详细信息,将 ll 的输出做为 more 的输入,即分屏显示。
texll /etc | more
在 root 目录下使用 ll 显示所有文件的详细信息,再在显示结果中使用 grep 查询 Demo 字符串
texll /root | grep Demo
显示 Linux 中所有进程的详细信息,查询 ssh 的字符串
texps -ax | grep ssh
>
【了解】管道命令/重定向命令
语法
命令 > 文件
将输出重定向到文件中(替换/覆盖)
操作演示
将系统中运行的所有进程信息,打印到 process.log 文件中,如果文件已存在,则覆盖
bashps -aux > process.log
>>
【了解】管道命令/重定向命令
语法
命令 >> 文件
将输出重定向到文件中(追加)
操作演示
将系统中运行的所有进程信息,打印到 process.log 文件中,如果文件已存在,则追加
bashps -aux >> process.log
&&
【了解】obj.condition() && obj.condition2()
逻辑控制命令
只有在
&&
左边的命令成功时,&&
右边的命令才会被执行。只要左边命令运行失败,后面的命令就不会被执行。【扩展】
xargs [-options] [command]
construct argument list(s) and execute utility, 将标准输入转为命令行参数。
参数
-d
, 更改分隔符-p
,打印出要执行的命令,询问用户是否要执行-t
, 打印出要执行的命令,直接执行
操作演示
在控制台运行以下命令,观察结果
bash# 利用文本cat命令查看/etc/passwd文件,并将在查看后的结果中查询root字符串 cat /etc/passwd | grep root # 直接使用grep在/etc/passwd中查询root字符串 grep root /etc/passwd # 无任何输出,echo命令不接受管道传参 echo "hello world" | echo # 将管道左侧的标准输入,转为命令行参数hello world,传给第二个echo命令。 echo "hello world" | xargs echo # 等同于mkdir one two three。如果不加xargs就会报错,提示mkdir缺少操作参数。 echo "one two three" | xargs mkdir # 创建文件list,三行分别为"one"、"two"、"three" # 查看利用xargs制作的单行mkdir命令 cat list | xargs echo mkdir # 查看利用xargs制作的多行mkdir命令 cat list | xargs -I {} echo mkdir {}
输出
a\tb\tc
,使用 xargs 输出a
、b
、c
bashecho -e "a\tb\tc" | xargs -d "\t" echo
输出
one two three
,使用 xargs 创建one
、two
、three
空文件,询问用户是否执行bashecho 'one two three' | xargs -p touch
输出
one two three
,使用 xargs 删除one
、two
、three
,删除前输出最终命令bashecho 'one two three' | xargs -t rm
shutdown【了解 】
halt, power-off or reboot the machine, 停止、关闭或重启机器
参数
- now, 立即关机
poweroff【重点】
同shutdown now
reboot【重点】
重启系统
小结
显示当前工作目录
pwd
查看进程状态
ps -aux
终止进程
kill -9
打印匹配给定模式的行
grep
管道命令
|
>
,覆盖>>
,追加&&
关机
poweroff
重启
reboot
权限操作【了解】
Linux 中对每个目录和文件都做了规定,只能由满足条件的用户才能操作这个目录或文件,这个规定叫权限。
用户和组的概念
概念 | 解释 |
---|---|
属主 | 目录或文件的所有者 |
属组 | 所有者所在的组 |
其他用户 | 其他用户和组 |
权限位
权限字母-权限数字对照
权限字母 | 权限数字 | 说明 |
---|---|---|
r | 4 | Read 读取 |
w | 2 | Write 写入 |
x | 1 | eXecute 执行 |
- | 0 | 没有权限 |
权限范围
权限范围 | 说明 |
---|---|
u | User 属主 |
g | Group 属组 |
o | Other 其他用户 |
a | All 上面所有的用户 |
权限操作
权限符号 | 说明 |
---|---|
+ | 添加权限 |
= | 修改权限 |
- | 删除权限 |
chmod MODE FILE
change file mode bits
示例
添加权限
改变 Demo.java 的权限,给属主添加 可执行权限
chmod u+x Demo.java
改变 Demo.java 的权限,给属组添加可读可运行权限
chmod g+rx Demo.java
Demo.java 的所有用户都添加可读可写可运行(所有权限)
chmod a+rwx Demo.java
属主添加可执行,其它用户添加 可写权限
chmod u+x, o+w Demo.html
修改权限
属主修改为可读可写可运行,属组可写权限,其他用户可执行
chmod u=rwx,g=w,o=x Demo.java
为所有用户修改为可读可写、不可运行权限
chmod a=rwx Demo.java
删除权限
所有用户不可读 不可写不可运行权限
chmod a-rwx Demo.java
属主删掉写,组删掉写权限
chmod u-w,g-w Demo.java
chown [options] user [:group] file...
change file owner and group,修改文件所有者和组别
参数
-R
递归修改目录及其下面内容的所有权
示例
将当前目录,及子目录中的所有文件,把所有者,改为 root 用户
chown -R root:root .
chgrp [OPTION]... {GROUP | --reference=REF_FILE} FILE...
Change group ownership,修改属主
小结
权限范围
- u
- user,属主
- g
- group,属组
- o
- other,其他用户
- a
- all,所有用户
- u
权限字母
- r
- read,可读
- w
- write,可写
- x
- execute,可执行
- r
权限操作
- 添加
- =
- 修改
- 删除
任务调度命令【了解】
crontab [OPTION]
maintains crontab files for individual users, 定时执行指定
参数
- -l, 显示当有已经设置好的定时执行的任务
- -e, 使用 vim 编辑任务
- -r, 删除定时任务
定时任务的配置
- 一行写一个任务
- 每个任务有 6 个列,前面 5 列是时间,最后 1 列是要执行的命令
格式说明
分 时 日 月 周 命令
minute | 表示分钟,可以是从0到59之间的任何整数。 |
hour | 表示小时,可以是从0到23之间的任何整数。 |
day | 表示日期,可以是从1到31之间的任何整数。 |
month | 表示月份,可以是从1到12之间的任何整数。 |
week | 表示星期几,可以是从0到7之间的任何整数,0或7代表星期日,1-6表示星期一到六。 |
command | 要执行的命令 |
特殊字符
特殊字符 | 说明 |
---|---|
星号(*) | 代表所有可能的值。 如:*,用在月上,表示每月执行;用在分上,表示每分执行 |
逗号(,) | 用逗号隔开的值指定某几个时间点。 如:1,2,5,用在小时上,表示1点,2点,5点 |
短横(-) | 表示一个整数范围。 如:2-6,用在日上,表示2号到6号 |
正斜杠(/) | 指定时间的间隔频率。 如: 0-10/2,用在小时上,表示0点到10点中每两小时执行一次。 与星号一起使用。 如: /10,用在分钟字段,表示每10分钟执行一次。 |
>> | 指定输出的文件 如: * * * * * date >> /root/mydate.log |
练习
分 时 日 月 周 命令
- 解释以下配置的含义
* * * * * command
每分钟执行
30 21 * * * command
每天 21:30 执行命令
3,15 * * * * command
每个小时的 3 分的时候,和 15 分的时候,执行
5,10 8-11 * * * command
8:05、8:10 9:05 9:10 … 分别执行
*/2 * * * * command
每偶数分钟时,执行 command
date
print or set the system date and time, 打印或设置系统日期和时间
小结
Linux 深入
主机名配置【了解】
hostname
show or set the system's host name, 显示或临时设置系统的主机名
hostname [HOSTNAME]
临时设置主机名为 HOSTNAME。如果 hostname 没有任何参数,显示主机名。
hostnamectl set-hostname
control the system hostname, 永久设置系统的主机名
hostnamectl set-hostname [HOSTNAME]
永久设置主机名为 HOSTNAME
操作演示
查看当前的主机名
texhostname
设置新的主机名为 future-weaver,再查看当前的主机名
texhostname future-weaver
设置新的主机名为 future-weaver,重启以后仍然有效
texhostnamectl set-hostname future-weaver
服务管理【掌握】
systemctl list-units *.service
显示已经启动的所有服务
systemctl start crond 【常用】开启服务
systemctl stop crond 【常用】关闭服务
systemctl status crond 【常用】显示服务当前状态
systemctl restart crond 【常用】重启服务,先关闭服务,再开启服务
systemctl reload crond 重新加载服务,相当于读取新的配置
systemctl enable crond
设置服务为开机自启动
systemctl disable crond
取消服务开机启动
Linux常用服务
- firewalld
- mysqld
- network
- sshd
- crond
小结
systemctl status mysqld
查看服务状态
systemctl start mysqld
启动服务
systemctl stop mysqld
关闭服务
systemctl restart mysqld
重新启动-先关闭,再启动
systemctl enable mysqld
开机启动
systemctl disable mysqld
取消开机启动
网络管理
currports【Windows 程序】
netstat【了解】
Print network connections, routing tables, interface statistics, masquerade connections, and multicast memberships.
显示网络连接,路由表,
接口状态,伪装连接,网络链路信息和组播成员组。参数
- -n --numberic, 显示进程的 IP 地址和端口号
- -t -tcp, 只显示使用 TCP 协议进程
- -l -listening, 只显示正在网络监听的进程(默认选项)
- -p -program, 显示程序的名字和进程的 ID
- -r -route, 显示路由表【重点】
操作演示
显示 TCP 协议的网络连接
texnetstat -t
显示 TCP 协议和监听中的网络连接
texnetstat -tl
显示 TCP 协议和监听中的网络连接,显示 IP 地址和端口号
texnetstat -tln
显示 TCP 协议和监听中的网络连接,显示 IP 地址和端口号,显示程序的名字
texnetstat -tlnp
显示路由表【重点】
texnetstat -r
查看端口号占用情况
netstat -naop | grep 端口号
curl【了解】
语法
curl [options...] <url>
参数
- -d, 指定请求体
- -H, 指定请求头
- -X, 指定请求方式
- -o, 指定响应输出位置
- -s, 静默模式
- -w, 指定除响应体外的其他信息
操作演示
- 访问百度,且不展示响应体
bash
curl -o /dev/null -s \
-w '%{http_code}\n%{time_total}\n%{content_type}' \
https://www.baidu.com
wget【了解】
wget [options...] <url>
下载文件
ab压测工具【了解】
Apache HTTP server benchmarking tool
安装
bash
yum -y install httpd-tools
语法
ab [options...] <url>
参数
- -n, 请求次数
- -c, 并发量
操作演示
- 暴力访问百度,请求次数为 5000,并发量为 100
bash
ab -n 5000 -c 100 https://www.baidu.com/
网卡配置
设置 ip 分为 2 种类型,dhcp 和 static。
dhcp 是动态获取 ip
static 是配置静态 ip
dhcp 动态获取 ip,可能 ip 经常会发生变化,导致客户端无法连接到。静态 ip 配置后就不会发生改变,这样客户端连接服务器具有更好的安全性。
关闭网卡
修改
/etc/sysconfig/network-scripts/ifcfg-enp0s3
,ONBOOT 参数设置为"no"运行命令
systemctl restart network
运行命令
ping www.future-weaver.com
,查看外网能否连接按原步骤,激活网卡
配置静态 IP 地址
运行命令netstat -r
,查看网关地址运行命令ip addr
,查看网卡硬件MAC地址找到enp0s8,link/ether
标志的xx:xx:xx:xx:xx:xx
就是硬件MAC地址需要手动新建ifcfg-xxxx配置文件时,获取网卡的UUID信息nmcli connection show
或nmcli con
修改
/etc/sysconfig/network-scripts/ifcfg-enp0s8
将BOOTPROTO=dhcp修改为BOOTPROTO=static
- BOOTPROTO=static
添加如下一行
- IPADDR=192.168.56.102
NM_CONTROLLED=noHWADDR=查到的硬件MAC地址GATEWAY=192.168.56.0NETMASK=255.255.255.0
重启网络
systemctl restart network
按原步骤,配置动态 ip
克隆虚拟机
- 关闭虚拟机
- 在 VirtualBox 操作界面,右键虚拟机,复制
- 设置新虚拟电脑名称
副本类型
选择完全复制
备份
选择当前虚拟电脑状态
Mac地址设置
选择为所有网卡重新生成MAC地址
- 复制
运行新虚拟机,运行nmtui命令,重新设置网卡
SSH免密登录
为什么要登录
在企业中,多台 Linux 机器是可以相互之间进行登录和退出的。用 Linux 自带的 SSH 客户端命令,可以通过输入用户名和密码的方式登录到另一台 Linux 机器中。
非对称加密【了解】
非对称加密特点【了解】
密钥成对出现(公钥、私钥)
使用公钥加密,就使用私钥解密
使用私钥加密,就使用公钥解密
SSH
Secure Shell 协议,安全壳协议。用于 Linux 之间加密登录一种协议
SSH两种验证机制
直接输入用户名和密码的方式
- ssh username@ip
免密登录,直接登录,不需要输入用户名和密码
tex如果网络中Linux服务器比较多,需要记住每台服务器的密码也是比较痛苦的事。你无需知道另一台机器上的帐号和口令,也可以登录到远程主机。我们说的SSH免密登录,就说的是这种方式
ssh-keygen
生成公钥和私钥,生成的公钥和私钥在/root/.ssh 目录下。id_rsa 是私钥,id_rsa.pub 是公钥
ssh-copy-id
ssh-copy-id root@192.168.56.102
将新生成的密钥(公钥)发送到指定服务器。在服务器的/root/.ssh/autorized_keys 文件中。
不需要输入密码了
用户管理命令【了解】
useradd [OPTION] LOGIN
create a new user or update default new user information, 创建一个新用户或更新默认新用户信息,创建好的用户信息在
/etc/passwd
文件中参数
LOGIN 指定创建的用户名
-m --create-home
创建用户的同时,在/home 下创建用户的主目录[默认参数]
-g --gid <GROUP>
创建用户的同时,指定用户所在的组。
未指定组名:默认就在一个与用户同名的组中。组名与用户名相同。
操作演示
进入/home 目录,查看目录的内容
texcd /home ll
创建用户 Jack,并且创建用户主目录
texuseradd Jack
再次 ll 查看/home 目录下存在 Jack 目录,默认用户 Jack 在一个叫 Jack 的组中。
texll
创建用户 Tom,把用户放在 Jack 这个组中,并且创建 Tom 主目录
texuseradd Tom -g Jack
通过 ll 查看/home 目录下的信息
texll
查看/etc/passwd 文件,可以看到创建的用户信息
texmore /etc/passwd
passwd [OPTION] [username]
update user's authentication tokens, 更新用户密码。
注意
- username 只有管理员才可以给指定的用户设置密码,默认为当前用户。
操作演示
设置 jack 的密码为 jack。如果提示无效的密码,忽略即可,再次输入同一个密码,修改成功。
passwd jack
设置 tom 的密码为 tom。如果提示无效的密码,忽略即可,再次输入同一个密码,修改成功。
passwd tom
退出登录 root 用户,以 jack 身份和 tom 身份登录
exit
whoami
print effective userid, 查看自己的用户名
su [OPTION] [username]
run a command with subtitute user and group ID, 切换用户
参数
- username 指定要切换的用户名,默认为 root
操作演示
当前用户是 root,临时切换成 Jack,不用输入密码
bashsu jack
cd 进入用户主目录,pwd 显示当前的目录,观察前面的提示符
bashcd ~ pwd
从 Jack 用户切换回 root,需要输入密码
bashsu root
cd 进入用户主目录,pwd 显示当前的目录
bashcd ~ pwd
输入 2 次 exit 再回到 root 用户
bashexit exit
userdel [OPTION] LOGIN
delete a user account and related files, 删除用户账户和相关文件
参数
- LOGIN 指定删除的用户名
- -r --remove, 删除用户的同时,也删除它的主目录
操作演示
使用 root 删除用户 Tom,同时删除 Tom 的主目录。如果 Tom 已经登录,则删除失败
bashuserdel tom -r
在/home 目录下已经找不到 Tom 主目录了
bashcd ~ ls -al
usermod [OPTION] LOGIN
modify a user account, 修改用户帐户
参数
- LOGIN 指定修改前的原用户名
- -l, login NEW_LOGIN 指定修改后的新用户名
操作演示
确认 Jack 这个用户不在线,如果在线需要将 Jack 登出
修改 Jack 的登录名为 Rose
texusermod -l Rose Jack
修改以后在 Linux 控制台,使用 Rose 重新登录
用户组管理命令【了解】
groupadd [OPTION] GROUP
create a new group, 创建一个新组。在
/etc/group
文件中,包含了所有创建组的信息操作演示
添加一个新的组 china
bashgroupadd china
查看/etc/group 文件,做为主组的用户不会显示出来。
bashcat /etc/group
usermod [OPTION] LOGIN
modify a user account, 修改用户帐户。一个用户只能有一个主组,可以有多个从组
参数
-g, --gid GROUP
tex修改用户的主组
-G, --groups GROUP1[,GROUP2,...[,GROUPN]]]
tex修改用户的从组(附属组),可以有多个从组
操作演示
进入/home 目录,ll 显示 home 目录的内容可以看到 Rose 是属于 Jack 这个组
bashcd /home ls -al
将 Rose 这个用户的主组 Jack 修改为 china 组
bashusermod -g china rose
使用 ll 显示/home 目录,查看 Rose 用户所属组名变成了 china
bashcd /home ls -al
创建两个组:Pakistan 和 Russia
bashgroupadd pakistan groupadd russia
将 Rose 添加进 Pakistan 和 Russia 两个从组中,组名之间使用逗号隔开。
bashusermod -G pakistan,russia rose
查看/etc/group 文件,查看到 Rose 与组的关系。文件中主组看不到用户的列表。
cat /etc/group
gpasswd [OPTION] GROUP
将用户从附属组(从组)中删除
参数
GROUP
tex指定要删除的组名
-d, --delete USER
tex将用户从附属组(从组)中删除
操作演示
把 Rose 从 china 这个组中删除,删除失败。
bashgpasswd china -d rose
把 Rose 从 Russia 这个组中删除
bashgpasswd russia -d rose
查看/etc/group 文件,发现 Rose 已经从 Russia 组中删除
bashcat /etc/group
groupmod [OPTION] GROUP
modify a group definition on the system, 修改组的名字
参数
-n, --new-nameNEW_GROUP
tex将组名改成新的组名
操作演示
在/home 目录下 ll 查看修改前的信息
bashcd /home ls -al
将 Rose 的主组名 china 改成 cn
bashgroupmod -n cn china
查看/home 目录信息,发现 Rose 的组名已经改成 cn
bashls -al
groupdel [OPTION] GROUP
delete a group, 删除一个组
参数
GROUP
tex删除指定的组
操作演示
删除 cn 组,删除失败,因为还有 Rose 把它做为主组
bashgroupdel cn
删除 Russia 这个组
bashgroupdel russia
删除 Pakistan 这个组
bashgroupdel pakistan
查看/etc/group 文件,发现没有这两个组的信息了
bashcat /etc/grou
软件安装命令【重点】
rpm
Red Hat Package Manager, 对linux中已经安装的软件进行管理
语法
rpm [OPTION]
参数
-v
,--verbose
tex提供更多的详细信息输出
-q 软件名
tex查询当前系统是否安装了指定的软件
-a
tex查询所有已经安装的软件
-h
tex在安装的过程中显示进度条 # 50%
-i
,--install 软件名
tex安装指定的软件
rpm -qa
rpm -ivh
操作演示
查看所有安装的软件
texrpm -qa
查看 gcc-c++这个软件包是否安装
texrpm -q gcc-c++
安装指定的软件
texrpm -ivh 软件名
配置国内镜像源
备份
bash
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
下载新的 CentOS-Base.repo
bash
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
生成缓存
bash
yum clean all
yum makecache
Redhat在线安装命令
在线安装命令(redhat系列发行版)
语法
yum [OPTION] [command] [package ...]
Yellowdog Updater Modified, 从指定的服务器自动下载包并且安装,可以自动处理依赖关系,一次安装所有依赖的软件包。
参数
- -y 所有的提问都回答 yes
指令
install, 安装软件
remove, 卸载软件
操作演示
安装 gcc-c++ 这个安装包,安装的提示全部回答 yes
texyum –y install gcc-c++
Debian在线安装命令
在线安装命令(debian系列发行版,包括Ubuntu)
语法
apt-get [options] [-o config=string] [-c=cfgfile] command [pkg]
参数
- -y 所有的提问都回答 yes
指令
- update
apt-get update是同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的索引,这样才能获取到最新的软件包。 2、apt-get update只是更新了apt的资源列表,没有真正的对系统执行更新。如果需要,要使用apt-get upgrade来更新。
upgrade
install pkg(s)
remove pkg(s)
clean
tinycorelinux在线安装命令
在线安装命令(tinycorelinux发行版)
语法
tce-load -wi [pkg]
搜索软件包
http://www.tinycorelinux.net/13.x/x86/tcz/
操作演示
安装 vim
textce-load -wi vim.tcz
小结
- rpm
离线安装
-qa
查询已经安装的软件
-ivh
安装软件
- yum
在线安装
-y 别来烦我,所有的回答全是yes
install
安装软件
remove
卸载软件
Linux服务器搭建
防火墙端口扫描
通过nmap等扫描工具,可以非常快速扫描出开放的外网端口。
JDK安装
配置Java环境
进入“/root”目录,解压 jdk 到指定目录/usr/local 下
textar -zxvf jdk-8u291-linux-x64.tar.gz -C /usr/local/
注:在客户端软件中按 ctrl+shift 复制,shift+insert 粘贴或鼠标右键
查看解压后的目录,目录中有 jdk1.8.0_211 为 jdk 解压的目录
配置 jdk 环境变量,打开/etc/profile 配置文件,将下面配置拷贝进去。export 命令用于将 shell 变量输出为环境变量。
注:在 linux 下以冒号分隔不同的路径,而 windows 下是分号。
注:引用变量在 linux 下是$变量名, 在 windows 下是%变量名%
/etc/profile
tex#set java environment export JAVA_HOME=/usr/local/jdk1.8.0_291 export CLASSPATH=.:$JAVA_HOME/lib export PATH=$JAVA_HOME/bin:$PATH
重新加载/etc/profile 配置文件,并测试
texsource /etc/profile
判断 JDK 是否安装成功
texjava -version javac -version
编写Hello World程序
Hello.java
javapublic class Hello { public static void main(String[] args) { System.out.println("Hello World!!!"); } }
编译成字节码文件
texjavac Hello.java
执行 Java 程序
texjava Hello
小结
将 jdk 的安装文件传输到 Linux 的/root 目录当中
解压到压缩包到:/usr/local
配置环境变量:/etc/profile
重新加载配置: source /etc/profile
MySQL安装
MySQL在线下载安装
注:需要连接互联网,在线 mysql 的安装包,5.6 的版本大约 86M
查看 CentOS 是否自带的 MySQL,如果已经安装需要卸载。如果没有找到,则表示没有安装。
texrpm -qa | grep mysql
在线获取 CentOS7 的 mysql 的 rpm 安装文件,直接执行如下命令
texwget https://repo.mysql.com/mysql80-community-release-el7-1.noarch.rpm
这条语句只是下载了一个rpm文件,25K大小
执行安装命令
texrpm -ivh mysql80-community-release-el7-1.noarch.rpm
得到两个配置文件,在/etc/yum.repos.d 目录下。
- mysql-community.repo 用于指定下载哪个版本的安装包
- mysql-community-source.repo 用于指定下载哪个版本的源码
修改 MySQL 的下载配置文件
- vim /etc/yum.repos.d/mysql-community.repo
# Enable to use MySQL 5.7 [mysql57-community] name=MySQL 5.7 Community Server baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/ # 设置为1,表示下载 enabled=1 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql ... [mysql80-community] name=MySQL 8.0 Community Server baseurl=http://repo.mysq.com/yum/mysql-8.0-community/el/7/$baseurl/ # 设置为0,表示不下载 enabled=0 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
在当前目录/etc/yum.repos.d 下执行下面的命令,开始在线下载:客户端,服务器端,开发的工具包。
texyum -y install mysql-community-client mysql-community-server mysql-community-devel
这里需要比较长的时间,要从互联网上下载86M左右的内容
使用 rpm 命令,可以查询到 mysql 已经安装好的包
texrpm -qa | grep mysql
启动MySQL服务并登录
启动 mysql 的服务
tex# Linux命令 systemctl start mysqld
将 mysql 加到系统服务中并设置开机启动
tex# Linux命令 systemctl enable mysqld
登录 mysql,root 用户默认没有密码
tex# Linux命令 mysql -u root -p # 查看随机密码 grep 'temporary password' /var/log/mysqld.log # 使用随机密码登录 mysql -u root -p
在 mysql 中修改自己的密码
tex# 查看当前的密码策略 show variables like '%validate_password%'; # 查看密码策略 # 修改密码策略 set global validate_password_policy=LOW; # 修改密码策略等级为LOW set global validate_password_length=4; # 密码的最小长度 set global validate_password_mixed_case_count=0; # 设置密码中至少要包含0个大写字母和小写字母 set global validate_password_number_count=0; # 设置密码中至少要包含0个数字 set global validate_password_special_char_count=0; # 设置密码中至少要包含0个特殊字符 # MySQL命令 set password = password('新密码');
设置远程访问权限
开启mysql的远程登录权限,默认情况下mysql为安全起见,不支持远程登录mysql,所以需要设置开启,并且刷新权限缓存。
远程登录 mysql 的权限登录 mysql 后输入如下命令
tex# MySQL命令 grant all privileges on *.* to 'root'@'%' identified by '远程密码'; flush privileges;
开放 Linux 的对外访问的端口 3306
tex# Linux命令 #开放3306端口 /sbin/iptables -I INPUT -p tcp --dport 3306 -j ACCEPT #开放的端口永久保存到防火墙 firewall-cmd --zone=public --add-port=3306/tcp --permanent #重启防火墙 systemctl restart firewalld
客户端Windows连接MySQL
在本地 Windows 系统使用 Navicat Premium 软件连接虚拟机中的 Linux 系统安装的 MySQL
小结
使用 wget 在线得到 mysql 的 rpm 文件
使用 rpm 安装上面的文件,在/etc/yum.repos.d 目录下得到两个下载的配置文件
修改下载的配置文件,指定下载的 mysql 版本为 5.6
使用 yum 下载 mysql。
安装完成以后要开启服务,并且设置开机启动。
在 mysql 中设置 root 远程访问的权限
开放防火墙 3306 端口号
Redis安装
Redis下载
http://download.redis.io/releases/redis-5.0.5.tar.gz
依赖工具安装
tex
yum -y install gcc tcl
Redis安装
将 redis-5.0.5.tar.gz 拷贝到 Linux 的 root 目录下
解压并进入目录
textar -zxvf redis-5.0.5.tar.gz cd redis-5.0.5
安装 Redis
texmake && make install
前端模式启动
前端模式启动的缺点是 ssh 命令窗口关闭则 redis-server 程序结束,不推荐使用此方法。
texredis-server
后端模式启动
复制配置文件至系统配置目录
texmkdir /etc/redis cp ~/redis-5.0.5/redis.conf /etc/redis
修改 redis.conf 配置文件, daemonize yes 开启后端模式
以配置文件启动 redis
texredis-server /etc/redis/redis.conf
Tomcat安装与项目发布
安装步骤
解压 Tomcat 到/usr/local 下
textar -zxvf apache-tomcat-8.5.68.tar.gz -C /usr/local/
开放 Linux 的对外访问的端口 8080
tex/sbin/iptables -I INPUT -p tcp --dport 8080 -j ACCEPT firewall-cmd --zone=public --add-port=8080/tcp --permanent
重启防火墙
texsystemctl restart firewalld
进入 bin 目录,启动 Tomcat
texchmod +x *.sh ./startup.sh
在 Windows 下打开浏览器访问 Linux 的 8080 端口
进入 bin 目录下,关闭服务器。关闭服务器以后,浏览器不能再访问。
tex./shutdown.sh
发布项目
- 将下面的项目部署到 linux 下运行
- Window 系统 mysql 导出数据库脚本文件
Linux 系统 myql 导入 windows 系统数据库导出的脚本文件
连接Linux的MySQL,创建数据库day35,在数据库上右键,选择执行SQL语句,导入数据库文件
将 war 包部署到 tomcat 上
先在idea中day35_ajax项目打包,根据如下配置生成war包,指定为Archive打包类型。
File->Project Structure->Artifacts->Type:Web Application Archive
进行Build当前项目生成war包
Build->Build Artifacts->Build
查看上面output输出目录
修改名字为day35.war
上传war文件到/usr/local/apache-tomcat-8.5.27/webapp目录下
打开浏览器浏览网站
texhttp://192.168.56.101:8080/day35/index.html
小结
解压 tomcat
开放端口号 8080
在 bin/startup.sh 启动服务器
在 bin/shutdown.sh 关闭服务器
mysql 的编码要改成 utf-8
Git安装
tex
yum remove -y git
make prefix=/usr/local/git all
make prefix=/usr/local/git install
vim /etc/profile
source /etc/profile
学习目标总结
- 能够独立搭建 Linux 环境
- 能够使用 Linux 进行目录操作的命令【重点】
- 能够使用 Linux 进行文件操作的命令【了解】
- 能够使用 Linux 进行目录文件压缩和解压的命令【重点】
- 能够使用 Linux 进行权限操作的命令【重点】
- 能够使用其它常用的 Linux 命令【了解】
- 能够使用客户端工具连接 Linux 系统【掌握】
- 能够使用 Linux 中的网络管理命令【了解】
- 能够使用 Linux 中 SSH 免密登录命令【掌握】
- 能够在 Linux 系统中安装 jdk 软件【重点】
- 能够在 Linux 系统中安装 mysql 软件【重点】
- 能够在 Linux 系统中安装 tomcat 软件【重点】
- 能够在 Linux 系统的 tomcat 中部署发布项目【重点】
参考资料
http://www.ruanyifeng.com/blog/2019/08/xargs-tutorial.html
扩展资料
Linux运维三剑客 - grep&sed&awk
https://book.douban.com/subject/1236944/
https://book.douban.com/subject/1499476/
https://book.douban.com/subject/28486163/
https://book.douban.com/subject/1876898/
https://book.douban.com/subject/35220550/
https://www.gnu.org/software/gawk/manual
https://www.gnu.org/software/sed/manual/
https://www.grymoire.com/Unix/Sed.html
https://www.grymoire.com/Unix/Awk.html
https://developers.redhat.com/products/rhel/download
https://www.oreilly.com/library/view/learning-awk-programming/9781788391030/