From a6e89a90d259a06199d01461159c3b00aada4d37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E8=88=9C?= <1991510644@qq.com> Date: Thu, 6 Jun 2024 13:22:32 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20240529 cat\345\221\275\344\273\244.md" | 150 ++++++++++ .../20240530 \346\233\277\346\215\242.md" | 259 ++++++++++++++++++ .../20240601 sed\345\221\275\344\273\244.md" | 96 +++++++ .../20240603 awk\345\221\275\344\273\244.md" | 143 ++++++++++ .../20240605 vim\345\221\275\344\273\244.md" | 143 ++++++++++ 5 files changed, 791 insertions(+) create mode 100644 "16 \347\250\213\350\210\234/20240529 cat\345\221\275\344\273\244.md" create mode 100644 "16 \347\250\213\350\210\234/20240530 \346\233\277\346\215\242.md" create mode 100644 "16 \347\250\213\350\210\234/20240601 sed\345\221\275\344\273\244.md" create mode 100644 "16 \347\250\213\350\210\234/20240603 awk\345\221\275\344\273\244.md" create mode 100644 "16 \347\250\213\350\210\234/20240605 vim\345\221\275\344\273\244.md" diff --git "a/16 \347\250\213\350\210\234/20240529 cat\345\221\275\344\273\244.md" "b/16 \347\250\213\350\210\234/20240529 cat\345\221\275\344\273\244.md" new file mode 100644 index 0000000..f82b3c2 --- /dev/null +++ "b/16 \347\250\213\350\210\234/20240529 cat\345\221\275\344\273\244.md" @@ -0,0 +1,150 @@ +**以下所有操作都在家目录执行:** + +### `cat` 命令操作题 + +1. **操作题一**:使用 `cat` 命令显示 `/etc/passwd` 文件的内容。 + + ```java + cat /etc/passwd + cat -n 文件 显示行号 + ``` + +2. **操作题二**:将文件 `/etc/passwd` 的内容复制到 `passwd_bak.txt` 文件中,但不使用 `cp` 命令。 + + ```java + cat /etc/passwd > passwd_bak.txt + ``` + +3. **操作题三**:新建两个文件 `file1.txt` 和 `file2.txt`,分别写一些不同的内容,再将这两个文件的内容合并到一个新的文件 `file3.txt` 中。 + + ```java + touch file1.txt file2.txt + cat file1.txt file2.txt > file3.txt + ``` + +### `tac` 命令操作题 + +1. 使用命令从尾部开始显示 `bigfile.txt` 文件的内容。 + + ```java + scp F:\ppt\Linux\bigfile.txt root@123.60.94.91:/home/student01 + tac bigfile.txt + ``` + +2. 尝试找出 `bigfile.txt` 文件的最后一行内容,只使用 `tac` 命令。 + + ```java + tac bigfile.txt | head -n 2 | tac + head -n 数字 是从尾部第一行显示到你的数字第几行 + tail -n 数字 是从开头第一行显示到你的数字第几行 + tac 是把你的倒过来,也就是从你的数字第几行开始显示到尾部第一行,正如这个是倒过来的一样 + grep "关键字" 这个命令会搜索关键字出现的最后位置,并显示及其后面的内容,直到最后 + ``` + +3. 查看 `bigfile.txt` 文件的最后5行内容。 + + ```java + tac bigfile.txt | head -n 5 + ``` + +4. 倒序查看 `bigfile.txt` 文件的最后5行内容。 + + ```java + tac bigfile.txt | head -n 5 | tac + ``` + +### `more` 命令操作题 + +1. **操作题一**:使用 `more` 命令查看 `bigfile.txt` 文件的内容,并在查看过程中使用空格键翻页。 + + ```java + more bigfile.txt + ``` + +2. **操作题二**:在 `more` 命令的查看过程中,如何使用回车键来逐行查看文件内容? + + ```java + more bigfile.txt + ``` + +3. **操作题三**:如何在 `more` 命令中搜索`bigfile.txt`特定字符串(例如 "error")并跳转到下一个匹配项? + + ```java + more bigfile.txt | grep -i "error" + grep "关键字" 这个命令会搜索关键字出现的那几行 + -i 不区分大小写 + ``` + +### `less` 命令操作题 + +1. **操作题一**:使用 `less` 命令查看 `bigfile.txt` 文件,并快速定位到文件的末尾。 + + ```java + less bigfile.txt | tac + ``` + +2. **操作题二**:在 `less` 命令中,如何向上和向下滚动文件内容? + + ```java + less bigfile.txt 使用上下键、Page Up/Page Down键进行滚动 + ``` + +3. **操作题三**:在 `less` 命令中,如何搜索`bigfile.txt`一个特定的函数名(例如 `def my_function`),并查看所有匹配项? + + ```java + less bigfile.txt | grep "def my_function" + ``` + +### `head` 命令操作题 + +1. **操作题一**:使用 `head` 命令显示 `bigfile.txt` 文件的前5行内容。 + + ```java + head -n 5 bigfile.txt + ``` + +2. **操作题二**:将 `bigfile.txt` 的前20行内容保存到 `bigfile_20.txt` 文件中。 + + ```java + head -n 20 bigfile.txt > bigfile_20.txt + ``` + +3. **操作题三**:如何结合 `head` 和 `grep` 命令来查找 `bigfile.txt` 文件中以 "A" 开头的前10行? + + ```java + head -n 10 bigfile.txt | grep -i "A" + 其实可以不要写10的因为默认是从开头到10 + ``` + +### `tail` 命令操作题 + +1. **操作题一**:使用 `tail` 命令显示 `bigfile.txt` 文件的最后20行内容。 + + ```java + tail -n 20 bigfile.txt + ``` + +2. **操作题二**:如何实时跟踪一个正在写入的日志文件(如 `bigfile.txt`)的最后10行内容? + + ```java + tail -fn 10 bigfile.txt + -f 是实时查看文件增长(日志文件) + ``` + +3. **操作题三**:在 `tail` 命令中,如何反向显示文件的最后10行内容(即按从旧到新的顺序显示)? + + ```java + tail -n 10 bigfile.txt | tac + 其实可以不要写10的因为默认是从尾部开始到10 + ``` + +### 综合题 + +**综合题**:假设你有一个非常大的日志文件 `bigfile.txt`,你需要找出所有包含 "ERROR" 字符串的行,并查看这些行及其之前的两行内容。如何结合使用 `grep`、`head`、`tail` 和其他命令来完成这个任务? + +```java +grep -n "ERROR" ./bigfile.txt && grep -v "ERROR" ./bigfile.txt | head | tail + -v 取反也就是查到这个以外的 +``` + +**提示**:你可能需要多次使用 `grep` 来找到包含 "ERROR" 的行,并使用 `tail` 和 `head` 来提取这些行及其前后的内容。另外,考虑使用管道(`|`)来连接命令。 \ No newline at end of file diff --git "a/16 \347\250\213\350\210\234/20240530 \346\233\277\346\215\242.md" "b/16 \347\250\213\350\210\234/20240530 \346\233\277\346\215\242.md" new file mode 100644 index 0000000..7732713 --- /dev/null +++ "b/16 \347\250\213\350\210\234/20240530 \346\233\277\346\215\242.md" @@ -0,0 +1,259 @@ +`sed`(stream editor)是一个用于处理和转换文本流的强大工具。它在脚本和命令行中都非常有用,可以执行插入、删除、查找、替换和数据过滤等操作。以下是一些具体用法、常见场景及示例: + +### 基本语法 + +```bash +sed [选项] '命令' 文件 +``` + +### 常见选项 + +- `-e`:直接在命令行模式中执行多个`sed`命令 +- `-f`:从指定的文件中读取`sed`命令 +- `-i`:直接编辑文件内容 +- `-n`:禁止自动打印模式空间内容 + +### 常见命令 + +- `s/regexp/replacement/`:替换匹配的正则表达式 +- `d`:删除行 +- `p`:打印行 +- `a\`:后面追加文本 append +- `i\`:前面插入文本 insert +- `c\`:替换整行文本 + +## 练习 + +为了设计一个素材文件,使得上述所有操作题都可以在这个文件上执行,我们可以创建一个名为 `lianxi.txt` 的文件,其中包含以下内容: + +```sh +# This is a comment line in the file +apple +This is an apple on the table. +Another apple is in the basket. + +banana +I like to eat banana for breakfast. + +A line with some text +A line starting with A + +Line 1 of report +Line 2 of report +... + +# A configuration option +# This is another comment + +Email: someone@example.com +This is a test email address: test@example.com + +A note about something + +Another note + +color is an important concept in art. +I like this color. +``` + +接下来,我们可以使用 `sed` 命令来执行上述操作题: + +### 操作题 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.csv +``` + +注意:尽管我们保存为 `.csv`,但内容并不是 CSV 格式。 + +3. 使用 `sed` 在文件 `lianxi.txt` 的每一行开头插入文本 "Line:",并将结果覆盖原始文件。 + +```bash +sed 's/^/Line/' lianxi.txt +``` + +或者(如果支持 `-i` 选项直接修改文件): + +```bash +sed -i 's/^/Line/' 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 +-n '开始,结束p' 文件名称 这是显示开始到结束的行内容 +``` + +### 操作题 3 + +1. 使用 `sed` 找到文件 `lianxi.txt` 中所有包含 "@example.com" 的邮箱地址,并将结果输出到标准输出。 + +```bash +sed -n '/@example.com/p' lianxi.txt +-n 禁止自动打印模式空间内容 +``` + +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 +``` + +## 作业 + +### exam.txt 文件内容: + +``` +This is a text file for practice. +It contains some words like dog, cat, and bird. +There are also numbers like 123 and 456. +# heihei +We will use sed to manipulate this file. +``` + +#### 修改操作 + +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 '1a\Welcome to sed manipulation' exam.txt > updated_exam.txt +a\ 是在指定行的后面插入一行 +``` + +1. 使用 `sed` 在文件 `exam.txt` 的`numbers`所在行插入一行 "This is a new line",并将结果输出到标准输出。 + +``` +sed '/numbers/c\This is a new line' exam.txt +c\ 是替换掉原本的行的内容 +``` + +#### 追加操作 + +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 'a\- 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 '/words/c\Replaced' exam.txt > updated_exam.txt +``` + +#### 多命令操作 + +1. 使用 `sed` 删除文件 `exam.txt` 中`dog`所在行,`file`换成`文件`,并将结果输出到标准输出。 + +``` +sed '/dog/d; s/file/文件/g' exam.txt +sed -e 's/file/文件/g' -e '/dog/d' exam.txt +-e 在每一个命令全面加一个-e sed -e '命令1' -e '命令2‘ +;号 在不同命令之间用;号分隔'命令1;命令2;命令3...' +``` + +1. 使用 `sed` 将文件 `exam.txt` 中,删除空白行并将所有以 "It" 开头的行替换为 "This", + +``` +sed '/^$/d; s/^It/This/g' exam.txt +sed -e '/^$/d' -e 's/^It/this/g' exam.txt +``` + +#### 脚本文件操作 + +1. 创建一个 `sed` 脚本文件 `replace_apple_with_orange.sed`,实现将文件 `exam.txt` 中所有 "apple" 替换为 "orange" 的功能,并将结果输出到标准输出。 + +``` +echo 's/apple/orange/g' > replace_apple_with_orange.sed +这个赋予指令只能弄要运行的指令命令,你把sed、exam.txt打进去会报错,识别不出来 +``` + +运行脚本: + +``` +sed -f replace_apple_with_orange.sed exam.txt +-f 读取脚本 因为脚本没写exam.txt,所有要补充一个查找的文件名称 +``` + +1. 创建一个 `sed` 脚本文件 `remove_blank_lines.sed`,实现删除文件 `exam.txt` 中所有空白行的功能,并将结果保存到新文件 `cleaned_exam.txt` 中。 + +``` +echo '/^$/d' > remove_blank_lines.sed +``` + +运行脚本: + +``` +sed -f remove_blank_lines.sed exam.txt > cleaned_exam.txt +``` \ No newline at end of file diff --git "a/16 \347\250\213\350\210\234/20240601 sed\345\221\275\344\273\244.md" "b/16 \347\250\213\350\210\234/20240601 sed\345\221\275\344\273\244.md" new file mode 100644 index 0000000..ab5ea2a --- /dev/null +++ "b/16 \347\250\213\350\210\234/20240601 sed\345\221\275\344\273\244.md" @@ -0,0 +1,96 @@ +# AWK + +文本处理的工具,也是一种编程语言。 + +## 命令结构 + +awk [选项] '脚本' 文件 + +脚本: + +开始语句块:在程序开始时执行 BEGIN + +通用语句块:逐行处理文件内容 pattern + +结束语句块:在程序结束时执行 END + +例如:头尾各加一行 + +awk 'BEGIN { print "我是开头"} { print } END { print "我是结尾" } ' student_scores.csv + +## 语句块 + +由模式 (pattern) 和动作 (action) 构成。 + +- 如果没有指定模式,则对每一行都执行动作。 +- 指定模式后,只有匹配模式的行,才执行动作,即满足条件才执行 + +例如:打印文件中所有包含 王 的行 + +awk '/王/ { print $0 }' student_scores.csv + +BEGIN { print "----开始-----" }:在处理文件开始时打印“----开始-----”。 + +$2 >= 80 { print }:对于每一行,如果第二个字段(数学成绩)大于或等于80,则打印该行。 + +END { print "----结束-----" }:在处理文件结束时打印“----结束-----”。 + +## 选项 + +-F + +指定输入字段分隔符。例如,`-F,` 将逗号设置为字段分隔符。 + +默认是以空格\t等为分隔符 + +类似于FS="分隔符" 在文件中使用 + +-v + +赋值外部变量。例如,`-v var=value`。 min=60 + +-f + +指定 Awk 脚本文件。 + +## 常用模式 + +### 正则表达式 + +/ / 内的 + +### 比较运算符 + +- `==`(等于) +- `!=`(不等于) +- `<`(小于) +- `<=`(小于等于) +- `>`(大于) +- `>=`(大于等于) + +### 逻辑运算符 + +- `&&`:逻辑与(AND) +- `||`:逻辑或(OR) +- `!`:逻辑非(NOT) + +### 三元运算符 + +条件运算符 `? :` + +## 常用动作 + +`print`:打印指定内容。 + +`printf`:格式化输出。 + +## 特殊变量 + +- `NR`:表示记录的数量(当前行号) +- `NF`:表示当前行的字段数量。`$NF`表示最后一列 +- `$0`:包含当前行的文本内容,即一整行内容。 +- `$1`、`$2`:表示当前行的第1个、第2个字段的内容,以次类推。 +- `FS`:输入时的域分割符。效果同-F选项 +- `OFS`:输出时的域分割符。 + +1. awk -F: '$3>=100 {print $0}' /etc/passwd \ No newline at end of file diff --git "a/16 \347\250\213\350\210\234/20240603 awk\345\221\275\344\273\244.md" "b/16 \347\250\213\350\210\234/20240603 awk\345\221\275\344\273\244.md" new file mode 100644 index 0000000..6c05238 --- /dev/null +++ "b/16 \347\250\213\350\210\234/20240603 awk\345\221\275\344\273\244.md" @@ -0,0 +1,143 @@ +1. vi 编辑器有几种模式? + + ```java + 三种模式: + 1、字符模式,在命令模式中按v键进入。 + 2、行模式,在命令模式中按V键进入。 + 3、块模式,在命令模式中按Ctrl+v键进入。 + ``` + +2. 如何进入 vi 编辑器的插入模式 + + ```java + 1、按i键进入插入模式(Insert mode),可以在光标当前位置开始插入文本。 + 2、按a键进入插入模式,可以在光标所在位置的下一个字符开始插入文本。 + 3、按o键进入插入模式,并在当前行的下一行创建一个新行开始插入文本。 + 4、按I(大写i)键进入插入模式,可以在当前行的开头插入文本。 + 5、按A(大写a)键进入插入模式,可以在当前行的末尾插入文本。 + ``` + +3. 如何进入 vi 编辑器的可视化模式 + + ```java + 按下v键即可进入可视化模式。 + ``` + +4. 在 vi 编辑器中如何复制一行 + + ```java + 按下y键,将选定的文本复制到剪贴板中。 + ``` + +5. 在 vi 编辑器中如何进行粘贴 + + ```java + 按下p键,将剪贴板中的内容粘贴到光标位置之后。 + ``` + +6. 如何删除从 3 行到 15 行的所有数据 + + ```java + :开始行号,结束行号d + :3,15d + ``` + +7. vim练习: + + - 光标移动练习,命令模式下: + + - 单位级 h j k l + - 单词级 w e b + - 块级 gg G 0 ^ $ H M L ngg nj nk + + 把下列句子按照第一句的正确顺序修改好并把多余的空行删除 + + ``` + this is a simple easy vim tutorial + + tutorial simple a easy this vim is + is this tutorial vim simple a easy + + + tutorial vim this is a easy simple + tutorial easy vim simple a this is + simple a vim easy tutorial is this + + tutorial is easy vim a simple this + + + vim simple this tutorial a easy is + a vim tutorial simple easy is this + + + easy a simple vim is tutorial this + vim tutorial is a easy simple this + a this vim tutorial is easy simple + this tutorial simple easy a is vim + + + easy tutorial this simple a is vim + a tutorial easy is this simple vim + + a tutorial vim is easy this simple + simple this easy is vim tutorial a + + this tutorial is a easy simple vim + vim is tutorial simple this easy a + + vim is simple this tutorial easy a + easy a simple is vim this tutorial + vim is tutorial simple a easy this + this vim is tutorial simple easy a + ``` + + ```java + :g/^$/d 删除空行 + ``` + + 先敲出以下代码,然后修正以下代码中的错误单词、重复单词、错误格式、多余行,修改函数名为 typing 并为定时器添加 300 毫秒延迟 + + ``` + const bbb = () => { + // this is is a description + // + // another descriptttion + const timer = setTimeout(( ) => { + console.log(that) alert('cool!') + // awosome man ! + }) + } + ``` + + 尝试在下面的文本中进行复制粘贴练习 + + ``` + 删除这一行 + 粘贴到这一行下面 + 剪切 ABC 并把它粘贴到 XYZ 前面,使这部分内容看起来像 + 剪切 并把它粘贴到 ABC XYZ 前面。 + ``` + + 尝试修改下列文本的大小写 + + ``` + Change this line to UPPERCASE, THEN TO lowercase. + ``` + + 按下面的说明进行操作 + + ``` + 按 dd 删除本行 + 按 . 重复删除操作 + 2. 再删除两行 + 这行也没了 + p 把刚才删掉的粘回来 + 3. 又多出 6 行 + ``` + + 左缩进、右缩进练习 + + ``` + 在这一行上依次按 3>>,<< 和 { + // this is is a description + // + // another descriptttion + const timer = setTimeout(( ) => { + console.log(that) alert('cool!') + // awosome man ! + }) + } + ``` + + 尝试在下面的文本中进行复制粘贴练习 + + ``` + 删除这一行 + 粘贴到这一行下面 + 剪切 ABC 并把它粘贴到 XYZ 前面,使这部分内容看起来像 + 剪切 并把它粘贴到 ABC XYZ 前面。 + ``` + + 尝试修改下列文本的大小写 + + ``` + Change this line to UPPERCASE, THEN TO lowercase. + ``` + + 按下面的说明进行操作 + + ``` + 按 dd 删除本行 + 按 . 重复删除操作 + 2. 再删除两行 + 这行也没了 + p 把刚才删掉的粘回来 + 3. 又多出 6 行 + ``` + + 左缩进、右缩进练习 + + ``` + 在这一行上依次按 3>>,<< 和