diff --git "a/\350\203\241\344\270\207\347\233\233/20240601-\345\210\235\345\247\213LINUX\347\237\245\350\257\20610.md" "b/\350\203\241\344\270\207\347\233\233/20240601-\345\210\235\345\247\213LINUX\347\237\245\350\257\20610.md" new file mode 100644 index 0000000000000000000000000000000000000000..740cb9183d170900efa133440b82f51e71c01f39 --- /dev/null +++ "b/\350\203\241\344\270\207\347\233\233/20240601-\345\210\235\345\247\213LINUX\347\237\245\350\257\20610.md" @@ -0,0 +1,315 @@ +`sed`(stream editor)是一个用于处理和转换文本流的强大工具。它在脚本和命令行中都非常有用,可以执行插入、删除、查找、替换和数据过滤等操作。以下是一些具体用法、常见场景及示例: + +### 基本语法 +```bash +sed [选项] '命令' 文件 +``` + +### 常见选项 +- `-e`:直接在命令行模式中执行多个`sed`命令 +- `-f`:从指定的文件中读取`sed`命令 +- `-i`:直接编辑文件内容 +- `-n`:禁止自动打印模式空间内容 + +### 常见命令 +- `s/regexp/replacement/`:替换匹配的正则表达式 +- `d`:删除行 +- `p`:打印行 +- `a\`:后面追加文本 append +- `i\`:前面插入文本 insert +- `c\`:替换整行文本 + +### 使用场景及示例 + +#### 1. 文本替换 +将文件`example.txt`中的所有`apple`替换为`orange`: +```bash +sed 's/apple/orange/g' example.txt # g 表示全局,所有 + +#### 2. 只替换第一个匹配项 +仅替换每行中的第一个`apple`: +```bash +sed 's/apple/orange/' example.txt # 每行一次 +``` + + 其它一些用法 + + ```bash + #在文件 example.txt 中每一行的开头插入 "Hello, " + sed 's/^/Hello, /' example.txt + # 在文件 example.txt 中每一行的末尾追加 "!": + sed 's/$/!/' example.txt + ``` + +#### 3. 指定行进行替换 +只替换第2行的`apple`: +```bash +sed '2s/apple/orange/' example.txt +# s前加行号 +sed '2s/apple/orange/g' example.txt +# 如果后面还加了g 就是该行的所有被替换 +``` + +#### 4. 删除行 delele +删除包含`apple`的行: +```bash +sed '2d' example.txt # 删除第2行 +sed 'd' example.txt # 删除所有行 +sed "/apple/d" # 删除所有包含了apple的行 +``` + +#### 5. 打印行 print => p +打印包含`apple`的行: +```bash +sed -n '/apple/p' example.txt +``` + +#### 6. 插入文本 a行后追加一行, i行前追加一行 c +在第2行后插入一行文本`This is inserted.`: +```bash +sed '2a\This is inserted.' example.txt +``` + + 除了手动指定哪一行,还能用关键字指定行的位置 + +**可先定位再执行,定位到关键字所在的行,再执行追加、插入、 替换** + +1. sed "/关键字/a\追加的内容" +2. sed "/关键字/i\插入的内容 +3. sed "/关键字/c\替换的内容 + +#### 7. 替换整行 c +将第2行替换为`This is replaced.`: +```bash +sed '2c\This is replaced.' example.txt +``` + +#### 8. ;结合多个命令 +删除包含`apple`的行并将`banana`替换为`grape`: +```bash +sed '/apple/d; s/banana/grape/g' example.txt +``` + +#### 9. 直接修改文件 +将文件`example.txt`中所有`apple`替换为`orange`并保存更改: +```bash +sed -i 's/apple/orange/g' example.txt +``` + +#### 10. 在命令行模式中执行多个`sed`命令 + +在`sed`命令中,`-e`选项允许你在一行中指定多个`sed`命令。每个命令都用`-e`前缀,并且这些命令会按照指定的顺序执行。这在需要对文本进行多个不同的操作时非常有用,而无需将多个`sed`命令链接在一起。 + +下面是一个使用`-e`选项在命令行中执行多个`sed`命令的示例: + + +```bash +echo "Hello, World!" | sed -e 's/Hello/Hi/' -e 's/World/Universe/' +``` +在这个例子中,我们首先使用`s/Hello/Hi/`将"Hello"替换为"Hi",然后使用`s/World/Universe/`将"World"替换为"Universe"。这两个替换操作都会在同一行文本上执行。 + +输出结果将是: + +``` +Hi, Universe! +``` +通过使用`-e`选项,你可以将多个`sed`命令组合在一起,以便在一次处理中完成多个文本转换任务。 + +#### 11. 使用包含 `sed` 命令的脚本文件 + +`-f` 选项允许 `sed` 从一个文件中读取编辑命令,而不是直接在命令行中指定。 + +第一步,先编写脚本文件test.txt + +```bash +# sed的命令脚本文件 +/apple/d # 删除包含apple的所有行 +s/banana/grape/ # 将banana替换成grape +# 注意多个命令直接一行一个,不用;号也不用-e +``` + +第二步,执行这个脚本 + +```bash +sed -f test.txt banana.txt # 使用test.txt中的sed命令对banana.txt文件进行处理 +``` + +## 作业111 +### 操作题 1 + +1. 使用 `sed` 将文件 `lianxi.txt` 中所有的 "apple" 替换为 "banana",并将结果输出到标准输出。 + +```bash +sed 's/apple/banana/g' lianxi.txt +``` + +2. 使用 `sed` 删除文件 `lianxi.txt` 中所有以字母 "A" 开头的行,并将结果保存到新文件 `clean_data.csv` 中。 + +```bash +sed '/^A/d' lianxi.txt > clean_data.cvs +``` + +注意:尽管我们保存为 `.csv`,但内容并不是 CSV 格式。 + +3. 使用 `sed` 在文件 `lianxi.txt` 的每一行开头插入文本 "Line:",并将结果覆盖原始文件。 + +```bash +sed -i 's/^/Line:/' lianxi.txt +``` + +或者(如果支持 `-i` 选项直接修改文件): + +```bash +sed 's/^/Line:/' lianxi.txt > lianxi.txt.tmp && mv lianxi.txt.tmp lianxi.txt +``` + +### 操作题 2 + +1. 使用 `sed` 将文件 `lianxi.txt` 中所有以 "#" 开头的行(注释行)删除,然后将结果输出到标准输出。 + +```bash +sed '/^#/d' lianxi.txt +``` + +2. 使用 `sed` 在文件 `lianxi.txt` 中每一行的末尾追加文本 " - The End",并将结果保存到新文件 `story_end.txt` 中。 + +```bash +sed 's/$/-The End' lianxi.txt > story_end.txt +``` + +3. 使用 `sed` 将文件 `lianxi.txt` 中第10行至第20行的内容输出到标准输出。 + +```bash +sed -n '10,20p' lianxi.txt + +``` + +### 操作题 3 + +1. 使用 `sed` 找到文件 `lianxi.txt` 中所有包含 "@example.com" 的邮箱地址,并将结果输出到标准输出。 + +```bash +sed -n '/@example.com/p' lianxi.txt +``` + +2. 使用 `sed` 删除文件 `lianxi.txt` 中的空白行,并将结果保存到新文件 `clean_notes.txt` 中。 + +```bash +sed '/^$/d' lianxi.txt > clean_notes.txt +``` + +3. 使用 `sed` 将文件 `lianxi.txt` 中所有的 "color" 替换为 "colour",并将结果输出到标准输出。 + +```bash +sed 's/color/colour/g' lianxi.txt +``` +## 作业222 +1. 使用 `sed` 将文件 `exam.txt` 中所有的 "dog" 替换为 "cat",并将结果输出到标准输出。 + +``` +sed 's/dog/cat/g' exam.txt + +``` + +1. 使用 `sed` 将文件 `exam.txt` 中所有的 "123" 替换为 "OneTwoThree",并将结果保存到新文件 `updated_exam.txt` 中。 + +``` +sed 's/123/OneTwoThree/g' exam.txt > updated_exam.txt +``` + +#### 删除操作 + +1. 使用 `sed` 删除文件 `exam.txt` 中所有以 "#" 开头的注释行,并将结果输出到标准输出。 + +``` +sed '/^#/d' exam.txt +``` + +1. 使用 `sed` 删除文件 `exam.txt` 中所有包含 "words" 的行,并将结果保存到新文件 `clean_exam.txt` 中。 + +``` +sed '/words/d' exam.txt > clean_exam.txt +``` + +#### 插入操作 + +1. 使用 `sed` 在文件 `exam.txt` 的第2行插入一行 "Welcome to sed manipulation",并将结果保存到新文件 `updated_exam.txt` 中。 + +``` +sed '2i\Welcome to sed manipulation' exam.txt > updated_exam.txt +``` + +1. 使用 `sed` 在文件 `exam.txt` 的`numbers`所在行插入一行 "This is a new line",并将结果输出到标准输出。 + +``` +sed '/numbers/a\This is a new line' exam.txt +``` + +#### 追加操作 + +1. 使用 `sed` 在文件 `exam.txt` 的末尾追加一行 "End of practice",并将结果保存到新文件 `updated_exam.txt` 中。 + +``` +sed '$a\End of practice' exam.txt > updated_exam.txt +``` + +1. 使用 `sed` 在文件 `exam.txt` 的每一行末尾追加内容 " - 2024-05-31",并将结果输出到标准输出。 + +``` +sed 's/$/- 2024-05-31/' exam.txt +``` + +#### 整行替换操作 + +1. 使用 `sed` 将文件 `exam.txt` 中所有以字母 "W" 开头的行替换为 "Not Available",并将结果输出到标准输出。 + +``` +sed '/^W/c\Not Available' exam.txt +``` + +1. 使用 `sed` 将文件 `exam.txt` 中所有包含 "words" 的行替换为 "Replaced",并将结果保存到新文件 `updated_exam.txt` 中。 + +``` +sed 's/.*words.*/Replaced/' exam.txt > updated_exam.txt +``` + +#### 多命令操作 + +1. 使用 `sed` 删除文件 `exam.txt` 中`dog`所在行,`file`换成`文件`,并将结果输出到标准输出。 + +``` +sed -e '/dog/d' -e 's/file/文件/g' exam.txt +``` + +1. 使用 `sed` 将文件 `exam.txt` 中,删除空白行并将所有以 "It" 开头的行替换为 "This", + +``` +sed -e '/^$/d' -e '/^It/c\This' exam.txt +``` + +#### 脚本文件操作 + +1. 创建一个 `sed` 脚本文件 `replace_apple_with_orange.sed`,实现将文件 `exam.txt` 中所有 "apple" 替换为 "orange" 的功能,并将结果输出到标准输出。 + +``` +s/apple/orange/g(不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会) +``` + +运行脚本: + +``` +sed -f replace_apple_with_orange.sed exam.txt(不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会) +``` + +1. 创建一个 `sed` 脚本文件 `remove_blank_lines.sed`,实现删除文件 `exam.txt` 中所有空白行的功能,并将结果保存到新文件 `cleaned_exam.txt` 中。 + +``` +/^$/d(不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会) +``` + +运行脚本: + +``` +sed -f remove_blank_lines.sed exam.txt > cleaned_exam.txt (不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会) +``` + diff --git "a/\350\203\241\344\270\207\347\233\233/20240603-\345\210\235\345\247\213LINUX\347\237\245\350\257\20611.md" "b/\350\203\241\344\270\207\347\233\233/20240603-\345\210\235\345\247\213LINUX\347\237\245\350\257\20611.md" new file mode 100644 index 0000000000000000000000000000000000000000..fe07f34502a281504c651c16536fc072d5c8b30a --- /dev/null +++ "b/\350\203\241\344\270\207\347\233\233/20240603-\345\210\235\345\247\213LINUX\347\237\245\350\257\20611.md" @@ -0,0 +1,187 @@ +# Awk 简介及应用 + +## 1. 介绍 + +Awk 是由 Aho、Weinberger 和 Kernighan 三位科学家开发的,特别擅长文本处理的 Linux 工具,是 Linux 下最常用的工具之一。Awk 也是一种编程语言,在编程语言排行榜上也能排上号。 + +awk、grep、sed是linux操作文本的三大利器,合称*文本三剑客* + +假设已有student_scores.csv 文件(后面的演示都基于这个文件),内容如下 + +``` +姓名,数学,语文,科学,班级 +张伟,85,92,88,1班 +李娜,78.5,81,79.5,2班 +王强,95,89,94.5,3班 +赵敏,90,72.5,70,2班 +刘洋,88,94,90,1班 +陈刚,74,85,80,1班 +杨梅,91,87,89,3班 +黄磊,55.5,90,86,3班 +周红,76,78,80,2班 +王彬,90,93.5,92,1班 +大王,85,86,45.5,2班 +小王,74,56,88,3班 +``` + +## 2. Awk 命令的结构 + +一般情况下,`awk` 命令的基本结构如下: + +```sh +awk [选项] '脚本' 文件 +# 最简单的一个脚本,打印全文 +awk '{ print }' student_scores.csv +``` + +这里的 `[选项]` 是可选的,它们在 `awk` 命令中通常出现在脚本和文件名之前。 + +AWK 脚本由一个或多个语句块组成,每个语句块可以是以下三种之一: + +1. 开始语句块:在程序开始时执行 `BEGIN { print "start" }` +2. 通用语句块:逐行处理文件内容 `pattern { commands }`, +3. 结束语句块:在程序结束时执行 `END { print "end" }` + +示例: + +```sh +awk 'BEGIN { print "开始" } pattern { commands } END { print "结束" }' file +# 头尾各加一行 +awk 'BEGIN { print "我是开头"} { print } END { print "我是结尾" } ' student_scores.csv +``` + +可以通过管道获取数据: + +```sh +cat file | awk 'BEGIN { print "start" } pattern { commands } END { print "end" }' +``` + +### 2.1 语句块的构成部分 + +语句块语法:由模式 (pattern) 和动作 (action) 构成。 + +```bash +awk 'pattern { actions }' # 即 模式 {动作} +# 模式 (pattern): 可以是正则表达式、关系表达式、特定条件等。 +# 动作 (action): 一组语句,描述在匹配模式的行上执行的操作 +# 示例 +awk '/王/ { print $0 }' student_scores.csv +# 打印文件中所有包含 王 的行。 +``` + +- 如果没有指定模式,则对每一行都执行动作。 +- 指定模式后,只有匹配模式的行,才执行动作,即满足条件才执行 + +### 2.2 深入理解三个语句块 + +**示例:** + +```sh +awk -F, 'BEGIN { print "----开始-----" } +$2>=80 { print } +END { print "----结束-----" } +' student_scores.csv +# 脚本解释 +# -F,:指定逗号作为字段分隔符,不指定默认是空格(\t)做分隔符 +# BEGIN { print "----开始-----" }:在处理文件开始时打印“----开始-----”。 +# $2 >= 80 { print }:对于每一行,如果第二个字段(数学成绩)大于或等于80,则打印该行。 +# END { print "----结束-----" }:在处理文件结束时打印“----结束-----”。 +``` + +**输出** + +运行上述脚本的输出如下: + +``` +----开始----- +姓名,数学,语文,科学 +张伟,85,92,88 +王强,95,89,94 +刘洋,88,94,90 +杨梅,91,87,89 +黄磊,82,90,86 +王彬,90,93,92 +----结束----- +``` + +### 2.3 术语解释 + +#### Awk 中的常用选项(限命令行) + +- `-F`:指定输入字段分隔符。例如,`-F,` 将逗号设置为字段分隔符。 + - 默认是以空格\t等为分隔符 + - 类似于FS="分隔符" 在文件中使用 + +- `-v`:赋值外部变量。例如,`-v var=value`。 min=60 +- `-f`:指定 Awk 脚本文件。例如,`-f script.awk`。 +- `-W`:控制警告和其他运行时选项。例如,`-W version` 用于显示版本信息。 + +#### Awk 中的常用模式(pattern) + +- 匹配正则表达式 + - `/pattern/`:匹配包含指定模式的行。例如,`/error/` 匹配所有包含“error”的行。 + - $2 ~ /pattern/ :匹配第2列包含关键字pattern的行, + - $2 !~ /pattern/:匹配第2列不包含关键字pattern的行 + +- 比较运算符 + - 匹配第 n 行。例如,`NR == 1` 匹配第一行。 + - `==`(等于),例$2 == "张三" 匹配第二列等于张三的行 + - `!=`(不等于) + - `<`(小于) + - `<=`(小于等于) + - `>`(大于) + - `>=`(大于等于) + +- 逻辑运算符 + - `NR >= m && NR <= n`:匹配第 m 到第 n 行。例如,`NR >= 2 && NR <= 4` 匹配第2到第4行。 + - `&&`:逻辑与(AND) + - `||`:逻辑或(OR) + - `!`:逻辑非(NOT) + +- 三元运算符 + - 条件运算符 `? :` + - grade = ($2 >= 60 ? "及格" : "不及格") + + +#### Awk 中的常用动作(action) + +- `print`:打印指定内容。例如,`print $1` 打印第一字段。 + +- `printf`:格式化输出。例如,`printf "%s\n", $1` 以格式化方式打印第一字段。 + + - 语法: + + ```bash + printf (format, expression1, expression2, ...) + # format 是一个包含格式说明符的字符串。 + # expression1, expression2, ... 是要格式化并插入到 format 字符串中的表达式。 + ``` + + - 常用的格式说明符 + + - `%s`:字符串 + - `%d`:有符号十进制整数 + - `%f`:浮点数 + + - 带有宽度和对齐的写法: + + - `%5s`:字段宽度为 5 的字符串,右对齐 + - `%-5s`:字段宽度为 5 的字符串,左对齐 + - `%10d`:字段宽度为 10 的有符号十进制整数,右对齐 + - `%-10d`:字段宽度为 10 的有符号十进制整数,左对齐 + - `%8.2f`:字段总宽度为 8,其中小数点后有 2 位的浮点数 + +- `{}`:包含一个或多个动作的块。例如,`{ print $1; print $2 }`。 + + - 用;号分隔多个动作语句 + - 如果每个语句在单独的行上,;号可以省略 + + +#### Awk 中的特殊变量 + +- `NR`:表示记录的数量(当前行号)。Numbers of Rows +- `NF`:表示当前行的字段数量。`$NF`表示什么?最后一列 Number of flied +- `$0`:包含当前行的文本内容,即一整行内容。有时候也省略 +- `$1`、`$2`:表示当前行的第1个、第2个字段的内容,以次类推。 +- `FS`:输入时的域分割符。效果同-F选项 File split +- `OFS`:输出时的域分割符。out File split \ No newline at end of file diff --git "a/\350\203\241\344\270\207\347\233\233/20240605-\345\210\235\345\247\213LINUX\347\237\245\350\257\20612.md" "b/\350\203\241\344\270\207\347\233\233/20240605-\345\210\235\345\247\213LINUX\347\237\245\350\257\20612.md" new file mode 100644 index 0000000000000000000000000000000000000000..8fda61bc59f6984dc85647cdaf4bf2b5eaa1ae56 --- /dev/null +++ "b/\350\203\241\344\270\207\347\233\233/20240605-\345\210\235\345\247\213LINUX\347\237\245\350\257\20612.md" @@ -0,0 +1,165 @@ +## 文件内容编辑-vim +### 光标移动 +#### 单位级 +``` +h 向左移动一个单位 +j 向下移动一个单位 +k 向上移动一个单位 +l 向右衔动一个单位 +``` + + +#### 单词级 +``` +w 向右移动到下一单词开头 +e 向右移动到下一单词结尾 +b 向左移动到下一单词开头 +``` + + +#### 块级 +``` +gg 移动光标到文档第一行 +G 移动光标到文档最后一行 +0 移动光标所在行的第一列 +^ 移动光标到非空的第一个字符 +$ 移动光标到所在行的最后一列 +H 移动光标到屏幕顶端 +M 移动光标到屏幕中间 +L 移动光标到屏幕底部 +gg 或者: 移动光标到第n行 +k 或者:- 移动光标到向上n行 +j 或者:+ 移动光标到向下n行 +``` + +### Visual模式 +``` +字符模式,在命令模式中按v键进入 +行模式,在命令模式中按V键进入 +块模式,在命令模式中按Ctrl+ v键进入 + +``` + +### vim内打开文件 +``` +:e <文件名称> 打开名为 filename 的文件,若文件不存在则创建之 +:Ex 在 Vim 中打开目录树,光标选中后回车打开对应文件(提示:- 进入上级目录 ) +``` + +### 内容查找 +#### 文档内查找 +``` +`*` 向后查找当前光标所在单词 +`#` 向前查找当前光标所在单词 +/ 向后查找指定字符串 +? 向前查找指定字符串 +n 继续查找下一个 +N 继续查找上一个 +``` +#### 行内查找 +``` +f 当前行内向行尾查找定位X字符 +t 当前行内向行尾查找定位X字符前一字符 +F 当前行内向行首查找定位X字符 +T 当前行内向行首查找定位X字符后一字符 +; 向当前方向查找下一个字符 +, 向当前反方向查找下一个字符 +``` + +### 文档修改与保存 +#### 插入 +``` +i 当前字符前插入 +I 当前行首插入 +a 当前字符后插入 +A 当前行尾插入 +o 在下一行插入 +O 在上一行插入 +``` +#### 删除 +``` +x 删除当前字符,相当于 insert 模式下的 Delete +X 删除前一个字符,相当于 insert 模式下的 Backspace +d 删除指定内容并保存到 Vim 剪贴板 +dd 删除当前行,并将删除的内容保存到 Vim 剪贴板 +cc 删除当前行并保存到 Vim 剪贴板,同时进入 INSERT 模式 +c 删除指定内容并保存到 Vim 剪贴板,同时进入 INSERT 模式 +``` +#### 复制 +``` +y 复制指定字符串到粘贴板 +yy 复制整行到粘贴板 +``` +#### 粘贴 +``` +p 在当前位置后粘贴 +P 在当前位置前粘贴 +``` +#### 合并 +``` +J 合并当前行和下一行 +``` +#### 替换 +``` +r 将当前字符替换为 X +gu将指定的文本转换为小写 +gU 将指定的文本转换为大写 +:%s/// 查找 search 内容并替换为 replace 内容(常用) +``` +#### 缩进 +``` +>> 向右缩进当前行 +<< 向左缩进当前行 +``` +#### 撤销与重做 +``` +u 撤销 +Ctrl-r 重做 +. 重复上一个动作,3.重复上次动作3次 +``` +#### 保存修改 +``` +:w 保存当前文件 +:wa 保存全部文件 +:wq or ZZ 保存并退出 +:q! or ZQ 强制退出,不保存 +:saveas 文件另存为 +:w 文件另存一份名为 的副本并继续编辑原文件 +``` + +## 作业 +1. vi 编辑器有几种模式? +``` +三种模式:一般指令模式、编辑模式、命令行模式 +``` + +2. 如何进入 vi 编辑器的插入模式 + +``` +1.按下i键,光标前插入。 +2.按下a键,光标后插入。 +3.按下o键,光标下一行插入。 +4.要退出插入模式,按下Esc键,然后输入:q +``` +3. 如何进入 vi 编辑器的可视化模式 +``` +1.在命令模式中按v键进入 +2.在命令模式中按V键进入 +3.在命令模式中按Ctrl+ v键进入 +``` +4. 在 vi 编辑器中如何复制一行 +``` +1.y 复制指定字符串到粘贴板 +2.yy 复制整行到粘贴板 + +``` +5. 在 vi 编辑器中如何进行粘贴 +``` +1.p 在当前位置后粘贴 +2.P 在当前位置前粘贴 +``` +6. 如何删除从 3 行到 15 行的所有数据 +``` +1.按Esc键进入正常模式。 +2.输入:3,15d,然后按Enter键以删除行。 +``` \ No newline at end of file diff --git "a/\350\203\241\344\270\207\347\233\233/20240611-\345\210\235\345\247\213LINUX\347\237\245\350\257\20613.md" "b/\350\203\241\344\270\207\347\233\233/20240611-\345\210\235\345\247\213LINUX\347\237\245\350\257\20613.md" new file mode 100644 index 0000000000000000000000000000000000000000..33d6da18471b4e7e201d04c0366c990ac4e5e6cf --- /dev/null +++ "b/\350\203\241\344\270\207\347\233\233/20240611-\345\210\235\345\247\213LINUX\347\237\245\350\257\20613.md" @@ -0,0 +1,52 @@ +### 安装 PacVim +首先按如下链接安装 Ncurses 库和开发工具。 + +如何在 Linux 中安装 Ncurses 库 +如何在 Linux 中安装开发工具 +请注意,如果没有 gcc 4.8.X 或更高版本,这款游戏可能无法正确编译和安装。我在 Ubuntu 18.04 LTS 上测试了 PacVim,并且完美运行。 + +安装 Ncurses 和 gcc 后,运行以下命令来安装 PacVim。 +``` +$ git clone https://github.com/jmoon018/PacVim.git +$ cd PacVim +$ sudo make install +``` +使用 PacVim 学习 Vim 命令 +启动 PacVim 游戏 +要玩这个游戏,只需运行: + +$ pacvim [LEVEL_NUMER] [MODE] +例如,以下命令以普通模式启动游戏第 5 关。 + +$ pacvim 5 n +这里,5 表示等级,n表示模式。有两种模式: + +n – 普通模式。 +h – 困难模式。 +失败条件 + +如果你碰到鬼魂(用红色 G 表示)或者波浪字符,你就会失去一条命。如果命小于 0 条,你将会输掉整个游戏。 + +这是实现的命令列表: +``` +< 如显示不全,请左右滑动 > +键 作用 +q 退出游戏 +h 向左移动 +j 向下移动 +k 向上移动 +l 向右移动 +w 向前移动到下一个 word 开始 +W 向前移动到下一个 WORD 开始 +e 向前移动到下一个 word 结束 +E 向前移动到下一个 WORD 结束 +b 向后移动到下一个 word 开始 +B 向后移动到下一个 WORD 开始 +$ 移动到行的末尾 +0 移动到行的开始 +gg/1G 移动到第一行的开始 +数字加 G 移动到由数字给出的行的开始 +G 移到最后一行的开头 +^ 移到当前行的第一个 word +& 1337 cheatz(打赢当前关) +``` \ No newline at end of file diff --git "a/\350\203\241\344\270\207\347\233\233/20240612-\345\210\235\345\247\213LINUX\347\237\245\350\257\20614.md" "b/\350\203\241\344\270\207\347\233\233/20240612-\345\210\235\345\247\213LINUX\347\237\245\350\257\20614.md" new file mode 100644 index 0000000000000000000000000000000000000000..db126bdc6b2b7e03071df3333aa6a13b90fe09d0 --- /dev/null +++ "b/\350\203\241\344\270\207\347\233\233/20240612-\345\210\235\345\247\213LINUX\347\237\245\350\257\20614.md" @@ -0,0 +1,479 @@ +## 刚安装完Deiban系统 7步走: + +1. 设置国内软件源镜像 /etc/apt/sources.list +2. 更新软件包列表:apt update +3. 更新系统:apt upgrade -y +4. 安装vim: + 1. apt install vim -y + 2. locate 从数据库中找, find实时从系统中找 + +5. 编辑网卡配置,设置静态IP: +6. 只在虚拟机上操作,不要在云服务器操作 + +```bash +vim /etc/network/interfaces + +# 按如下设置 +# The primary network interface +allow-hotplug ens192 +iface ens192 inet dhcp + +#重新启动网络服务 +sudo systemctl restart networking +``` + +5. 修改SSHD配置,允许root用户远程登录 + +```bash +vim /etc/ssh/sshd_config + +# 取消如下代码的注释,并且将其值设置为yes,以允许root用户的远程登录 +22 +PermitRootLogin yes + + +``` + +6. 配置环境变量,简单化ls的用法 + + +/etc/profile.d /etc/nginx/conf.d/ + +```bash + export LS_OPTIONS='--color=auto' + alias ls='ls $LS_OPTIONS' + alias ll='ls $LS_OPTIONS -l' + alias l='ls $LS_OPTIONS -lA' + +``` +7. 配置环境变量,设置当前系统字符集,以接受中文 + +/etc/profile.d/lang.sh +```bash +export LC_ALL=C.utf8 +``` + +要确保设置生效,可以重新加载该文件并检查环境变量 + +```sh +source /etc/profile.d/lang.sh +echo $LC_ALL +``` + + + +几个常用命令 + +以下是一些常见的 Linux 命令,包括它们的使用场景、核心术语讲解以及示例: + +### 1. `time` + +**使用场景**:用于测量命令的执行时间。 + +**核心术语**: + +- **real**:总的时间(墙上时钟时间)。 +- **user**:用户态 CPU 时间。 +- **sys**:内核态 CPU 时间。 + +**示例**: + +```bash +time ls +``` + +输出: + +```plaintext +real 0m0.003s +user 0m0.001s +sys 0m0.002s +``` + +### 2. `date` + +**使用场景**:显示或设置系统日期和时间。 + +**核心术语**: +- **%Y**:四位数的年份。 +- **%m**:两位数的月份。 +- **%d**:两位数的日期。 + +**示例**: + +```bash +date "+%Y-%m-%d %H:%M:%S" +``` + +输出: + +```plaintext +2024-06-10 15:30:00 +``` + +### 3. `timedatectl` + +**使用场景**:查看和设置系统时间和日期,时区和 NTP(网络时间协议)设置。 + +**核心术语**: +- **NTP**:网络时间协议,用于同步时间。 +- **RTC**:实时时钟。 + +**示例**: + +```bash +timedatectl status +``` + +输出: + +```plaintext +Local time: Mon 2024-06-10 15:30:00 UTC +Universal time: Mon 2024-06-10 15:30:00 UTC +RTC time: Mon 2024-06-10 15:30:00 +Time zone: Etc/UTC (UTC, +0000) +System clock synchronized: yes +NTP service: active +``` + +### 4. `reboot` + +**使用场景**:重新启动系统。 + +**核心术语**: + +- **systemd**:系统和服务管理器。 + +**示例**: + +```bash +sudo reboot +``` + +### 5. `poweroff` + +**使用场景**:关闭系统电源。 + +**核心术语**: + +- **halt**:停止系统所有的 CPU 功能。 + +**示例**: + +```bash +sudo poweroff +``` + +### 6. `wget` + +**使用场景**:从网络上下载文件。 + +**核心术语**: + +- **URL**:统一资源定位符。 +- **HTTP/HTTPS**:超文本传输协议。 + +**示例**: + +```bash +wget https://example.com/file.txt +``` + +### 7. `curl` + +**使用场景**:从网络上获取或发送数据。 + +**核心术语**: + +- **URL**:统一资源定位符。 +- **GET/POST**:HTTP 请求方法。 + +**示例**: + +```bash +curl -O https://example.com/file.txt +``` + +### 8. `ps` + +**使用场景**:查看当前运行的进程。 + +**核心术语**: + +- **PID**:进程标识符。 +- **TTY**:终端类型。 + +**示例**: + +```bash +ps aux # 显示所有用户的所有进程 一般会结合。grep,awk等过滤数据 +``` + +### 9. `kill` + +**使用场景**:向进程发送信号(通常用于终止进程)。 + +**核心术语**: + +- **SIGTERM**:请求中止进程。 +- **SIGKILL**:强制终止进程。 + +**示例**: + +```bash +kill 1234 # kill 进程号,用pidof 进程名。来查看具体的进程的进程号 +``` + +### 10. `killall` + +**使用场景**:向指定名称的所有进程发送信号。 + +`先安装psmisc` + +1. 安装psmisc 后,就会有pstree和killall + +**核心术语**: + +- **signal**:信号,通知进程执行某种操作。 + +**示例**: + +```bash +killall firefox +``` + +### 11. `ip` + +**使用场景**:显示和操作网络接口和路由。 + +**核心术语**: + +- **address**:IP 地址。 +- **route**:路由信息。 + +**示例**: + +```bash +ip addr show +``` + +### 12. `ss` + +**使用场景**:显示套接字统计信息。旧版是netstat + +**核心术语**: + +- **TCP**:传输控制协议。 +- **UDP**:用户数据报协议。 + +**示例**: + +```bash +ss -tuln # 可以查看哪些端口开放着 +``` + +### 13. `uname` + +**使用场景**:显示系统信息。 + +**核心术语**: + +- **kernel**:操作系统内核。 +- **OS**:操作系统。 + +**示例**: + +```bash +uname -a +``` + +### 14. `uptime` + +**使用场景**:显示系统运行时间和负载。 + +**核心术语**: +- **load average**:系统平均负载。 + +**示例**: + +```bash +uptime +``` + +### 15. `who` + +**使用场景**:显示当前登录用户信息。 + +**核心术语**: + +- **login**:用户登录信息。 +- **TTY**:终端类型。 + +**示例**: + +```bash +who +``` + +### 16. `last` + +**使用场景**:显示系统上最近的登录信息。 + +**核心术语**: + +- **wtmp**:记录登录和注销事件的文件。 + +**示例**: + +```bash +last +``` + +### 17. `ping` + +**使用场景**:测试网络连通性。 + +- **ICMP**:互联网控制消息协议。 +- **echo request**:回显请求。 + +**示例**: + +```bash +ping example.com +``` + +### 18. `traceroute` + +**使用场景**:显示到达网络主机的路径。 + +**核心术语**: + +- **hop**:从一个网络节点到另一个的跳转。 +- **TTL**:生存时间。 + +**示例**: + +```bash +traceroute example.com +``` + +### 19. `history` + +**使用场景**:显示命令历史记录。 + +**核心术语**: + +- **bash history**:记录用户输入的命令历史。 + +**示例**: + +```bash +history +``` + +`top` 命令用于显示系统的运行进程信息,包括 CPU 占用情况、内存占用情况、进程列表等。通过 `top` 命令可以实时监控系统的运行状态,了解系统的负载情况。 + +`pidof` 命令用于根据进程名查找对应的进程ID(PID)。例如,如果你知道某个进程的名字,但不知道它的PID,你可以使用 `pidof` 命令来查找。语法通常是 `pidof <进程名>`,比如 `pidof python` 会返回所有名为 `python` 的进程的PID。 + + + +`free` 和 `df -h` 是两个用于查看系统资源利用情况的常用命令: + +1. **`free`**:该命令用于显示系统内存的使用情况,包括物理内存和交换空间(swap)。执行 `free` 命令时,会显示系统的内存信息,包括总内存、已使用内存、空闲内存以及缓冲区和缓存等情况。 + + 示例输出: + ``` + total used free shared buff/cache available + Mem: 8081256 2133468 3458604 430300 2488184 5261632 + Swap: 0 0 0 + ``` + + 输出中的字段含义如下: + - `total`: 总内存量 + - `used`: 已使用的内存量 + - `free`: 空闲的内存量 + - `shared`: 用于共享的内存量 + - `buff/cache`: 用于缓存的内存量 + - `available`: 可用的内存量 + +2. **`df -h`**:该命令用于显示文件系统的磁盘空间利用情况。执行 `df -h` 命令时,会显示系统中每个挂载的文件系统的磁盘使用情况,包括总容量、已使用空间、剩余空间以及挂载点等信息。 + + 示例输出: + ``` + Filesystem Size Used Avail Use% Mounted on + /dev/sda1 20G 15G 3.6G 81% / + /dev/sda2 30G 20G 8.8G 70% /home + ``` + + 输出中的字段含义如下: + - `Filesystem`: 文件系统设备 + - `Size`: 文件系统总容量 + - `Used`: 已使用的空间 + - `Avail`: 可用空间 + - `Use%`: 使用百分比 + - `Mounted on`: 挂载点 + +通过这两个命令,你可以快速了解系统的内存和磁盘空间使用情况,以便进行系统资源管理和监控。 + + + +`du` 命令用于估算文件或目录的磁盘使用情况。它可以显示指定文件或目录的磁盘使用量,以及每个子目录的磁盘使用量,帮助用户了解文件系统上的空间分布情况。以下是 `du` 命令的一些常见使用场景: + +1. **查看当前目录的磁盘使用情况**: + + ``` + 复制代码 + du -h + ``` + + 这将以人类可读的格式显示当前目录及其所有子目录的磁盘使用情况。 + +2. **查看特定目录的磁盘使用情况**: + + ``` + du -h /目录名 + ``` + + 这将显示指定目录及其所有子目录的磁盘使用情况。 + +3. **显示文件或目录的总磁盘使用量**: + + ``` + du -sh /path/to/file_or_directory + ``` + + 这将显示指定文件或目录的总磁盘使用量, `-s` 参数表示仅显示总和, `-h` 表示以人类可读的格式显示。 + +4. **显示目录中每个文件的磁盘使用量**: + + ``` + 复制代码 + du -ah /path/to/directory + ``` + + 这将显示指定目录中每个文件的磁盘使用量, `-a` 参数表示包括所有文件。 + +5. **按照磁盘使用量排序显示目录**: + + ``` + du -h | sort -h + ``` + + 这将按照磁盘使用量从小到大排序显示当前目录及其所有子目录的磁盘使用情况。 + +6. **限制显示的深度**: + + ``` + du -h --max-depth=1 /path/to/directory + ``` + + 这将仅显示指定目录的直接子目录的磁盘使用情况, `--max-depth` 参数用于指定显示的深度。 + + + + + + + + + diff --git "a/\350\203\241\344\270\207\347\233\233/20240613-\345\210\235\345\247\213LINUX\347\237\245\350\257\20615.md" "b/\350\203\241\344\270\207\347\233\233/20240613-\345\210\235\345\247\213LINUX\347\237\245\350\257\20615.md" new file mode 100644 index 0000000000000000000000000000000000000000..4343d1d3100e015979e1555ebad26a0c10588d5b --- /dev/null +++ "b/\350\203\241\344\270\207\347\233\233/20240613-\345\210\235\345\247\213LINUX\347\237\245\350\257\20615.md" @@ -0,0 +1,127 @@ +## 重定向和管道 + +在 Linux 和其他 Unix 系统中,重定向和管道是非常重要的功能,它们允许用户将命令的输出重定向到文件、其他命令或设备。以下是对重定向和管道符的详细解释、使用场景、核心术语以及示例。 + +### 重定向 + +重定向允许将命令的输入或输出重定向到文件或其他命令。常用的重定向符号包括 `>`、`>>`、`<`、`2>` 等。 + +#### 输出重定向 + +1. **覆盖输出重定向 `>`** + + 将命令的标准输出重定向到一个文件,如果文件已经存在,则覆盖它。 + + ```bash + ls > filelist.txt + ``` + + 这个命令将 `ls` 命令的输出保存到 `filelist.txt` 文件中,如果文件已存在,则会被覆盖。 + +2. **追加输出重定向 `>>`** + + 将命令的标准输出追加到一个文件的末尾,如果文件不存在,则创建它。 + + ```bash + echo "Hello, World!" >> greetings.txt + ``` + + 这个命令会将 "Hello, World!" 追加到 `greetings.txt` 文件中。 + +#### 输入重定向 + +1. **输入重定向 `<`** + + 将文件的内容作为命令的输入。 + + ```bash + sort < unsorted_list.txt + ``` + + 这个命令将 `unsorted_list.txt` 文件的内容作为 `sort` 命令的输入进行排序。 + +#### 错误重定向 + +1. **错误输出重定向 `2>`** + + 将命令的错误输出重定向到一个文件。 + + ```bash + ls non_existent_file 2> error_log.txt + ``` + + 这个命令会将 `ls` 命令的错误信息保存到 `error_log.txt` 文件中。 + +2. **错误输出追加重定向 `2>>`** + + 将命令的错误输出追加到一个文件。 + + ```bash + ls non_existent_file 2>> error_log.txt + ``` + + 这个命令会将 `ls` 命令的错误信息追加到 `error_log.txt` 文件中。 + +3. **同时重定向标准输出和标准错误输出** + + 使用 `&>` 符号将标准输出和错误输出同时重定向到同一个文件。 + + ```bash + command &> output_and_error_log.txt + ``` + + 这个命令会将 `command` 的标准输出和错误输出都保存到 `output_and_error_log.txt` 文件中。 + +### 管道 `|` + +管道符号 `|` 将一个命令的输出作为另一个命令的输入。管道是进行命令链式操作的重要工具。 + +#### 使用场景 + +1. **将命令的输出传递给另一个命令** + + ```bash + ls -l | grep "txt" + ``` + + 这个命令会将 `ls -l` 的输出传递给 `grep "txt"`,只显示包含 "txt" 的行。 + +2. **多命令链式操作** + + ```bash + ps aux | grep "sshd" | awk '{print $2}' + ``` + + 这个命令链会列出所有进程 (`ps aux`),然后过滤包含 "sshd" 的行 (`grep "sshd"`),最后提取进程 ID (`awk '{print $2}'`)。 + +### 示例解析 + +#### 使用管道和重定向的综合示例 + +1. **查找特定文件并将结果保存到文件** + + ```bash + find / -name "*.log" 2> errors.txt | sort > sorted_log_files.txt + ``` + + 这个命令会在根目录下查找所有以 `.log` 结尾的文件,将错误信息重定向到 `errors.txt`,并将结果进行排序后保存到 `sorted_log_files.txt`。 + +### 总结 + +- **重定向**: + - `>`:将输出重定向到文件(覆盖)。 + - `>>`:将输出追加到文件。 + - `<`:将文件内容作为输入。 + - `2>`:将错误输出重定向到文件。 + - `2>>`:将错误输出追加到文件。 + - `&>`:将标准输出和错误输出同时重定向到文件。 + +- **管道 `|`**: + - 将一个命令的输出作为另一个命令的输入,用于链式操作。 + +## 思考: + +``` +<< 是什么功能? +()把命令包括起来,是干什么功能? +``` \ No newline at end of file diff --git "a/\350\203\241\344\270\207\347\233\233/20240615-\345\210\235\345\247\213LINUX\347\237\245\350\257\20616.md" "b/\350\203\241\344\270\207\347\233\233/20240615-\345\210\235\345\247\213LINUX\347\237\245\350\257\20616.md" new file mode 100644 index 0000000000000000000000000000000000000000..43ab6af02b3ab273422d137c647f9f4d4fb34ff3 --- /dev/null +++ "b/\350\203\241\344\270\207\347\233\233/20240615-\345\210\235\345\247\213LINUX\347\237\245\350\257\20616.md" @@ -0,0 +1,263 @@ +### 用户与文件权限的管理 +#### 1. 用户管理 + ##### 1. 分类 + ``` + - 超级用户 root ,最高权限,不受一般权限的限制,编号0 ,提示符是 # + - 内置用户 :由系统自动创建 ,编号1-999 + - 普通用户 :我们用root权限手动创建用户,受权限控制 ,编号从1000依次递增 + - 创建普通用户test会自动创建他的编号u ,他原生组g(和用户名同名test),附加组 G (test),初始化的时候一定是u 1000(test), 1000(test),1000(test) + - 普通不能创建普通用户,只有root + - 提示符是 $ + - u user 用户 uid + - group 组 gid + - Group +``` + ##### 2. 用户 + ``` + 1. 添加 + - useradd -m -d /home/YYY -s /bin/bash XXX + - adduser + 2. 删除 + - userdel XXX + - userdel -r xxx 删除用户和相关的目录 + 3. 修改 + - usermod -G 组号|组名 XXX : usermod -G stu u15 覆盖原来的附加组(扩展组) + - usermod -aG 组号|组名 XXX : usermod -aG stu u15 保留原有附加组前提下,追加新的附加组 + - usermod -s /bin/aaa u15 + 4. 密码 + - passwd 用户名 root修改指定用户的密码 + - passwd 修改当前登录用户的密码,即自己的密码 + 5. 查询 + - id 用户名 指定用户 + - /etc/passwd + 6. 切换 + - su 仅仅切换了身份,不切换目录和shell等环境 + - su - 完全切换,连环境变量和目录一起切换 + +``` + ##### 3. 用户组:编号也是从1000开始 + ``` + 1. 添加 + - groupadd student 添加一个组,编号自动的 + - groupadd -g 8888 student2 添加一个组,编号自动的 + 2. 删除 groupdel 组号|名 + 3. 修改 groupmod + 4. 查询 + - /etc/group +``` +#### 2. 文件管理 + ##### 文件属性:10个字符,连接数或子目录数,文件拥有者,文件所属的用户组,文件大小,修改时间,文件|目录名 + ##### 10个字符: + - 第1位 文件类型 + ``` + - d 目录 + - -普通文件 + - l 连接文件 + - b c s p 等其它文件 + ``` + - 后9位分别代表了:三种角色的权限,每3位一组 + ``` + - 2-4 拥有者权限 + - 5-7 用户组的权限 + - 8-10 其它人的权限 + ``` + ##### 基本权限 + ``` + - 读 r (read) : 打开并显示文件内容,查看目录基本信息 + - 写 w (write) : 文件,可以写入,修改,删除内容,目录:创建,修改,删除文件|目录 + - 执行 x (execute) :文件如果是二进制或脚本文件就可以执行,目录表示可以进入 + ``` + ##### 特殊权限 + - SUID + - GUID + ##### 隐藏权限 + ``` + - lsattr 列出隐藏权限 + - chattr 修改隐藏权限 + - +i 增加,不得任意更动文件或目录的效果 + - -i 消除 + ``` + ##### 权限表示 + ``` + - 字符 + - 数字 + - r == 4 + - w == 2 + - x == 1 + - 身份表示 + - u 拥有者 (user) + - g 用户组(group) + - o 其它人 (other) + - a 所有人 (all) + - 修改权限 :root可以改任何文件,而拥有者可以改自己拥有文件 + - chmod 要的权限 文件|目录 + - chmod u+w,g-r,o=rw 1.txt + - chmod 755 1.txt + - 修改拥有者 + - chown 用户名 文件名 + - 修改文件所属的用户组 + - chgrp 组名|号 文件|目录 + - sudo + - 修改 /etc/sudoers 文件 + - 将 用户追加到sudo组 :sudo usermod -aG sudo u15 +``` +#### 3. Linux执行命令的过程 + 1. 如果这个命令是绝对路径,就直接执行 + 2. 如果不是, + 1. 查一下是不是别名,是执行对应的命令 + 2. 从环境变量中找这个命令 $PATH中的路径依次查找这个命令 + 3. 本地也没有,就报错了。 +### 作业 + +#### 什么是linux 硬连接和软连接(快捷方式) + + 一、硬链接(Hard Link) +1.定义: + +硬链接是通过文件系统中的索引节点(inode)来进行连接的。多个文件名可以指向同一个索引节点,这就是硬链接。 + +2.特点: +只有文件可以建立硬链接,目录不可以。 +类似于复制多份文件,但实际上只是增加了一个文件名指向同一个inode。 +删除一个硬链接并不会影响文件本身,只有当最后一个硬链接被删除时,文件的数据块及目录的连接才会被释放. + +3.命令: +使用ln命令可以创建硬链接,默认情况下ln命令就产生硬链接。 +例如:ln 源文件名 硬链接名 + +二、 软链接(Soft Link/Symbolic Link) +1.定义: +软链接类似于Windows中的快捷方式,它包含了另一个文件或目录的路径信息。 +软链接是一个特殊的文件,其内容是它指向的文件或目录的路径名。 +2.特点: +文件和目录都可以建立软链接。 +删除软链接不会影响被指向的文件或目录。 +如果被指向的文件或目录被移动、重命名或删除,软链接将失效。 +3.命令: +使用ln -s命令可以创建软链接。 +例如:ln -s 源文件名 软链接名 + +4.作用: +创建快捷方式:在不移动原文件或目录的情况下,创建一个指向它的快捷方式。 +简化路径:将较长或复杂的路径简化为一个易于记忆和使用的路径。 +跨文件系统访问:软链接可以跨越不同的文件系统或磁盘分区。 +共享库链接:在Linux系统中,软链接还可以用于链接共享库文件。 +#### 总结 +硬链接和软链接都是Linux中用于引用文件或目录的机制。 +硬链接通过inode进行连接,类似于文件的多个名字;软链接通过路径进行连接,类似于文件的快捷方式。 +硬链接只能用于文件,不能用于目录;而软链接可以用于文件和目录。 +硬链接和文件内容共享inode,删除硬链接不影响文件内容;删除软链接不影响被指向的文件或目录。 +### 权限管理练习 + +1. 创建/guanli 目录,在/guanli下创建zonghe 和 jishu 两个目录(一条命令) +``` +sudo mkdir -p /guanli/{zonghe,jishu} +``` +2. 添加组帐号zonghe、caiwu、jishu,GID号分别设置为2001、2002、2003 +``` +sudo groupadd -g 2001 zonghe +sudo groupadd -g 2001 caiwu +sudo groupadd -g 2003 jishu +``` +3. 创建jerry、kylin、tsengia、obama用户,其中的kylin用户帐号在2020年12月30日后失效 +``` +sudo useradd jerry +sudo useradd kylin -e 2020-12-30 +sudo useradd tsengia +sudo useradd obama +``` +4. 将jerry、kylin、tsengia、obama等用户添加到zonghe组内 +``` +sudo usermod -aG zonghe jerry +sudo usermod -aG zonghe kylin +sudo usermod -aG zonghe tsengia +sudo usermod -aG zonghe obama +``` +5. 创建handy、cucci用户,其中cucci帐号的登录Shell设置为“/sbin/nologin” +``` +sudo useradd handy +sudo useradd cucci -s /sbin/nologin + +``` +6. 将handy、cucci等用户添加到jishu组内 +``` +sudo usermod -aG jishu handy +sudo usermod -aG jishu cucci +``` +7. 将上述的所有用户均要求加入到guanli组内 +``` +sudo usermod -aG guanli jerry +sudo usermod -aG guanli kylin +sudo usermod -aG guanli tsengia +sudo usermod -aG guanli obama +sudo usermod -aG guanli handy +sudo usermod -aG guanli cucci +``` +8. 将zonghe组内的obama用户删除 +``` +sudo gpasswd -d obama zonghe +``` +9. 为jerry用户设置密码为“123456”(使用普通方法)为cucci用户设置密码为“redhat” +``` +sudo passwd jerry # 输入密码 123456 +sudo passwd cucci # 输入密码 redhat +``` +10. 将jerry用户锁定,并查看锁定状态 +``` +sudo passwd -l jerry +sudo passwd -S jerry +``` +11. 打开两个xshell窗口,通过(who 或者 w)命令查看连接状态,并通过fuser杀掉其中一个 +``` +sudo fuser -k /dev/pts/X +``` +12. 查看cucci用户,属于那些组,并查看其详细信息 +``` +groups cucci +id cucci +``` +13. 手工创建账号student(预留) +``` +sudo useradd student +``` +14. 设置权限及归属:/guanli目录属组设为guanli, /guanli/zonghe目录的属组设为zonghe /guanli/jishu目录的属组设为jishu,设置3个目录都是禁止其他用户访问的权限 +``` +sudo chown :guanli /guanli +sudo chown :zonghe /guanli/zonghe +sudo chown :jishu /guanli/jishu +sudo chmod 770 /guanli +sudo chmod 770 /guanli/zonghe +sudo chmod 770/guanli/jishu + +``` +15. 建立公共目录/ceshi允许技术组内的所有用户读取、写入、执行文件, 禁止其他用户读、写、执行 +``` +sudo mkdir /ceshi +sudo chown :jishu /ceshi +sudo chmod 770 /ceshi +``` +16. 清除jerry用户密码 +``` + sudo passwd -d jerry +``` +17. 锁定cucci用户密码并查看状态 +``` + sudo passwd -l cucci + sudo passwd -S cucci + ``` +18. 修改obama用户的UID为8888 +``` +sudo usermod -u 8888 obama +``` +19. 通过passwd命令修改kylin用户的最长密码使用期限为60天 + +``` +sudo chage -M60 kylin +``` + +20. 通过id groups等命令查看用户handy信息 + + ``` +id handy +groups handy +``` \ No newline at end of file diff --git "a/\350\203\241\344\270\207\347\233\233/20240617-\345\210\235\345\247\213LINUX\347\237\245\350\257\20617.md" "b/\350\203\241\344\270\207\347\233\233/20240617-\345\210\235\345\247\213LINUX\347\237\245\350\257\20617.md" new file mode 100644 index 0000000000000000000000000000000000000000..7e222c222c2203872dbb0cc577c2ff7692181093 --- /dev/null +++ "b/\350\203\241\344\270\207\347\233\233/20240617-\345\210\235\345\247\213LINUX\347\237\245\350\257\20617.md" @@ -0,0 +1,462 @@ +## 1. 什么是Cron? + +Cron是一种基于时间的任务调度程序,用于在特定时间或时间间隔自动执行任务。它是Unix类操作系统(包括Linux)中的一个守护进程,能够按照用户定义的时间表运行指定的脚本或命令。 + +“Cron” 的读音是 /krɒn/,“Cron”的读音在中文中可以表述为“克隆”(kè lóng)。 + +## 2. Cron的配置文件 + +在Debian系统中,Cron任务的配置文件通常分为以下几类: + +1. **用户级Cron任务**:每个用户都有自己的Cron任务配置文件,位于`/var/spool/cron/crontabs/username`。 +2. **系统级Cron任务**:系统级的Cron任务配置文件位于`/etc/crontab`和`/etc/cron.d/`目录下。 +3. **周期性任务目录**:这些目录包含在特定时间间隔运行的脚本,例如: + - `/etc/cron.hourly/` + - `/etc/cron.daily/` + - `/etc/cron.weekly/` + - `/etc/cron.monthly/` + +## 3. 编辑Cron任务 + +### 3.1 使用`crontab`命令 + +用户可以使用`crontab`命令来编辑、查看或删除自己的Cron任务【用户级】。 + +cron table 时间周期表,计划任务表 + +- **编辑Cron任务**: + + ```sh + crontab -e # edit + ``` + + 这将打开用户的Cron配置文件进行编辑。 + +- **查看Cron任务**: + + ```sh + crontab -l # list + ``` + + 这将列出用户当前的Cron任务。 + +- **删除Cron任务**: + + ```sh + crontab -r # remove + ``` + + 这将删除用户的所有Cron任务。 + +**Cron任务语法** + +Cron任务的格式如下: + +```sh +* * * * * command_to_execute # command_to_execute 可以是命令也可以是包含命令的文件 +- - - - - +| | | | | +| | | | +----- 星期几 (0 - 7) (星期天 = 0 或 7) +| | | +------- 月份 (1 - 12) +| | +--------- 日期 (1 - 31) +| +----------- 小时 (0 - 23) ++------------- 分钟 (0 - 59) +``` + +例如,要每天凌晨3点执行一个备份脚本,可以添加以下条目: + +```sh +0 3 * * * /path/to/backup_script.sh +``` + +[点击查看:cron表达式详细介绍以及常用的例子](https://developer.aliyun.com/article/1349827) + +### 3.2 使用`/etc/crontab` + +系统级的Cron任务可以直接编辑`/etc/crontab`文件。该文件具有一个额外的字段用于指定运行任务的用户: + +``` +# m h dom mon dow user command +17 * * * * root cd / && run-parts --report /etc/cron.hourly +25 6 * * 1 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) +47 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly ) +``` + +### 3.3 使用`/etc/cron.d/` + +在`/etc/cron.d/`目录下,可以创建单独的文件来定义Cron任务。每个文件的格式与`/etc/crontab`类似。 + +例如,可以在`/etc/cron.d/mytasks`中定义: + +``` +30 2 * * * root /usr/local/bin/my_script.sh +``` + + + +### 3.4 特殊符号 + +**常用的如下:** + +1. **星号(`*`)** + + - **含义**:匹配任何值,,即每一。 + - **示例**:在分钟字段中使用 `*` 表示每一分钟都运行一次任务。 + + ```sh + * * * * * /path/to/command + ``` + +2. **逗号(`,`)** + + - **含义**:指定一个列表值,列出所有指定值 a,b,c。 + - **示例**:在小时字段中使用 `0,6,12,18` 表示任务将在每天的0点、6点、12点和18点运行。 + + ```sh + 0 0,6,12,18 * * * /path/to/command + ``` + +3. **短横线(`-`)** + + - **含义**:指定一个范围值,开始-结尾。 + - **示例**:在日期字段中使用 `1-5` 表示任务将在每个月的1号到5号之间运行。 + + ```sh + 0 0 1-5 * * /path/to/command + ``` + +4. **斜杠(`/`)** + + - **含义**:指定步长值,即间隔。 + - **示例**:在分钟字段中使用 `*/15` 表示任务每15分钟运行一次。 + + ```sh + */15 * * * * /path/to/command + ``` + +5. **L(Last)** + + - **含义**:表示最后一个。可以在月的天数或星期几中使用。 + - **示例**:在日期字段中使用 `L` 表示每个月的最后一天。 + + ```sh + 0 0 L * * /path/to/command + ``` + + - **示例**:在星期几字段中使用 `5L` 表示每个月的最后一个星期五。 + + ```sh + 0 0 * * 5L /path/to/command + ``` + +### 3.5 例子和应用 + +1. **每月的第一个工作日** + + ```sh + 0 9 1W * * /path/to/command + ``` + +2. **每月的最后一天** + + ```sh + 0 23 28-31 * * [ "$(date +\%d -d tomorrow)" == "01" ] && /path/to/command + ``` + +3. **每个月的最后一个星期五** + + ```sh + 0 23 * * 5L /path/to/command + ``` + +4. **每隔10分钟** + + ```sh + */10 * * * * /path/to/command + ``` + +通过使用这些特殊符号,可以灵活地定义各种复杂的时间调度任务,使得cron更加强大和易用。 + + + +### 3.6 注意事项 + +1. **路径问题**:Cron任务运行时使用的环境变量可能与用户的交互式Shell不同,确保在脚本中使用绝对路径。 +2. **权限问题**:确保脚本具有可执行权限,并且Cron任务的用户有权限执行该脚本。 + +## 4. 系统级任务 + +### **4.1 crontab 和 cron.d** + +在Debian和其他基于Unix的操作系统中,`/etc/crontab` 和 `/etc/cron.d/` 目录用于管理系统级的计划任务。虽然它们的功能类似,但在使用场景和配置格式上有一些细微的区别。以下是它们的详细介绍和使用场景: + +#### **4.1.1** **`/etc/crontab`** + +**特点:** + +1. **全局配置文件**:`/etc/crontab` 是一个全局配置文件,用于定义系统级的定时任务。 + +2. **文件格式**:与用户级的 `crontab` 文件相比,`/etc/crontab` 多了一个字段,用于指定执行任务的用户。格式如下: + + ``` + m h dom mon dow user command + ``` + + 例如: + + ``` + 30 2 * * * root /usr/local/bin/backup.sh + ``` + + 这行表示每天凌晨2:30以root用户的身份执行 `/usr/local/bin/backup.sh`。 + +**使用场景:** + +- **统一管理系统任务**:适合定义一些系统级的任务,比如系统备份、日志轮替等。 +- **需要不同用户执行的任务**:如果需要在同一文件中定义由不同用户执行的任务,可以使用 `/etc/crontab`。 + +#### **4.1.2** **`/etc/cron.d/`** + +**特点:** + +1. **目录结构**:`/etc/cron.d/` 目录中可以包含多个文件,每个文件可以定义多个任务。 + +2. **文件格式**:与 `/etc/crontab` 文件的格式相同,需要包含一个用户字段。格式如下: + + ``` + m h dom mon dow user command + ``` + + 例如,在 `/etc/cron.d/mytasks` 文件中: + + ``` + 0 4 * * * root /usr/local/bin/daily_task.sh + 15 14 1 * * user /usr/local/bin/monthly_report.sh + ``` + +**使用场景:** + +- **模块化管理**:适合将不同的任务分模块管理,每个模块一个文件。例如,可以为不同的应用程序或服务创建单独的文件。 +- **包管理系统的任务**:一些软件包在安装时会自动在 `/etc/cron.d/` 中创建任务文件,这是包管理系统用来添加特定任务的常见方法。 + +#### **4..13 选择使用场景** + +1. **统一和简洁管理**: + - 如果你希望在一个文件中集中管理所有系统级的Cron任务,可以使用 `/etc/crontab`。 + - 适合于系统管理员需要定期检查和修改所有任务的场景。 + +2. **分离和模块化管理**: + - 如果你希望将Cron任务按模块或应用分开管理,使用 `/etc/cron.d/` 是更好的选择。 + - 适合于不同团队或不同软件包管理各自的定时任务,避免相互干扰。 + +#### **4.1.4 示例对比** + +`/etc/crontab` 示例: + +```sh +# m h dom mon dow user command +30 2 * * * root /usr/local/bin/backup.sh +45 3 * * 7 user /usr/local/bin/cleanup.sh +``` + +`/etc/cron.d/backup` 示例: + +```sh +# m h dom mon dow user command +30 2 * * * root /usr/local/bin/backup.sh +``` + +`/etc/cron.d/cleanup` 示例: + +```sh +# m h dom mon dow user command +45 3 * * 7 user /usr/local/bin/cleanup.sh +``` + +通过这种方式,使用 `/etc/cron.d/` 可以更加灵活地管理和组织不同的任务。 + + + +## 5. 周期性任务目录 + +### 5.1 目录说明 + +1. **`/etc/cron.hourly/`**:每小时运行一次目录中的所有脚本。 +2. **`/etc/cron.daily/`**:每天运行一次目录中的所有脚本。 +3. **`/etc/cron.weekly/`**:每周运行一次目录中的所有脚本。 +4. **`/etc/cron.monthly/`**:每月运行一次目录中的所有脚本。 + +### 5.2 **使用方法** + +1. **创建脚本**:将要定期运行的脚本放置到相应的目录中。 + +2. **设置权限**:确保脚本具有执行权限。可以使用以下命令设置: + + ```sh + chmod +x /etc/cron.daily/your_script.sh + ``` + +### 5.3 示例案例 + +1. **每小时运行任务**: + + - **用例**:每小时检查系统资源使用情况并记录到日志文件。 + + - **步骤**: + + 1. 创建脚本 `/etc/cron.hourly/resource_check.sh`: + + ```sh + #!/bin/bash + date >> /var/log/resource_usage.log + top -b -n1 | head -n 20 >> /var/log/resource_usage.log + ``` + + 2. 设置脚本权限: + + ```sh + chmod +x /etc/cron.hourly/resource_check.sh + ``` + +2. **每日运行任务**: + + - **用例**:每天备份数据库。 + + - **步骤**: + + 1. 创建脚本 `/etc/cron.daily/db_backup.sh`: + + ```sh + #!/bin/bash + mysqldump -u root -pYourPassword your_database > /backup/db_$(date +\%F).sql + # $(date +%F) 表示的是命令替换(command substitution),而不是简单的变量。 + # 在Shell中,命令替换的形式是 $(command),它会执行括号内的命令,并用其输出结果替换整个表达式。 + ``` + + 2. 设置脚本权限: + + ```sh + chmod +x /etc/cron.daily/db_backup.sh + ``` + +3. **每周运行任务**: + + - **用例**:每周清理一次系统缓存。 + + - **步骤**: + + 1. 创建脚本 `/etc/cron.weekly/cache_cleanup.sh`: + + ```sh + #!/bin/bash + apt-get clean + ``` + + 2. 设置脚本权限: + + ```sh + chmod +x /etc/cron.weekly/cache_cleanup.sh + ``` + +4. **每月运行任务**: + + - **用例**:每月生成并发送系统报告。 + + - **步骤**: + + 1. 创建脚本 `/etc/cron.monthly/system_report.sh`: + + ```sh + #!/bin/bash + report_date=$(date +\%Y-\%m-\%d) + df -h > /var/reports/system_report_$report_date.txt + mail -s "Monthly System Report" admin@example.com < /var/reports/system_report_$report_date.txt + ``` + + 2. 设置脚本权限: + + ```sh + chmod +x /etc/cron.monthly/system_report.sh + ``` + +### 5.4 注意事项 + +1. **脚本格式**:确保脚本是可执行的,并且首行包含正确的shebang(例如 `#!/bin/bash`)。 +2. **日志记录**:为调试和审计目的,可以在脚本中添加日志记录功能,以便了解脚本的执行情况。 +3. **测试脚本**:在将脚本放入周期性任务目录之前,最好手动测试脚本,以确保其在预期环境下正常工作。 + +## 作业 +1. 每天3:00执行一次 +``` +0 3 * * * echo hhhh >> /home/root/a.txt +``` +2. 每周六2:00执行 +``` +0 2 * * 6 echo hhhh >> /home/root/a.txt +``` +3. 每周六1:05执行 +``` +5 1 * * 6 echo hhhh >> /home/root/a.txt +``` +4. 每周六1:25执行 +``` +25 1 * * 6 echo hhhh >> /home/root/a.txt +``` +5. 每天8:40执行 +``` +40 8 * * * echo hhhh >> /home/root/a.txt +``` +6. 每天3:50执行 +``` +50 3 * * * echo hhhh >> /home/root/a.txt +``` +7. 每周一到周五的3:40执行 +``` +40 3 * * 1-5 echo hhhh >> /home/root/a.txt +``` +8. 每周一到周五的3:41开始,每10分钟执行一次 +``` +41-59/10 3 * * 1-5 echo hhhh >> /home/root/a.txt +0-49/10 4 * * 1-5 echo hhhh >> /home/root/a.txt +``` +9. 每天的10:31开始,每2小时执行一次 +``` +31 10-0/2 * * * echo hhhh >> /home/root/a.txt +``` +10. 每周一到周三的9:30执行一次 +``` +30 9 * * 1-3 echo hhhh >> /home/root/a.txt +``` +11. 每周一到周五的8:00,每周一到周五的9:00执行一次 +``` +0 8,9 * * 1-5 echo hhhh >> /home/root/a.txt +``` +12. 每天的23:45分执行一次 +``` +45 23 * * * echo hhhh >> /home/root/a.txt +``` +13. 每周三的23:45分执行一次 +``` +45 23 * * 3 echo hhhh >> /home/root/a.txt +``` +14. 每周一到周五的9:25到11:35、13:00到15:00之间,每隔10分钟执行一次 +``` +25-34/10,35-44/10,45-54/10 9 * * 1-5 echo hhhh >> /home/root/a.txt +不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会不会 +``` +15. 每周一到周五的8:30、8:50、9:30、10:00、10:30、11:00、11:30、13:30、14:00、14:30、5:00分别执行一次 +``` +30,50 8,9,10,11,13,14,15 * * 1-5 echo hhhh >> /home/root/a.txt +``` +16. 每天16:00、10:00执行一次 +``` +0 16,10 * * * echo hhhh >> /home/root/a.txt +``` +17. 每天8:10、16:00、21:00分别执行一次 +``` +10 8,16,21 * * * echo hhhh >> /home/root/a.txt +``` +18. 每天7:47、8:00分别执行一次 +``` +47 7,8 * * * echo hhhh >> /home/root/a.txt +``` \ No newline at end of file