文件处理高级

一、命令行文本编辑器vi、vim
如果没安装vim的话先安装,安装命令:yum install vim -y

怎么去编辑命令
  vi 后面跟上文件的路径可以是绝对路径也可以是相对路径,比如相对路径 vi a.txt 一回车开始编辑文件,
  一回车进入这个界面之后默认进入的是命令行模式,可以敲一些命令 比如/root,意思就是查找这个文本文件所有包含root这个内容的行。
  一回车会发现定在包含root的第一行内容,下面还有包含的,按小n跳到下一个,如果找完了左下角会红色字提示:已经回到最开始位置。如果想往上找就shift+n。

在命令行模式下我们想要编辑文件内容得输几个指令:a,i o都行,可能会有不同的效果,但按他们三个都会进入编辑模式。
a,左下角提示insert,就可以进入编辑内容了,编辑好之后要想保存退出怎么办呢,得由输入模式退回到命令行模式,按esc键重新回到命令行模式,然后再命令行模式输入个冒号就进入到末行模式,在末行模式下在冒号后我们也可以敲一堆指令,如果此时我们还想继续编辑就按ESC键回到命令行模式,按a,i o都行进入编辑模式
如果在末行模式下输入wq一回车就保存退出了,一个文件就编辑完毕了。

a和i和o区别是,a是基于当前光标所在位置的后面写,i是往前写,o光标会跳到下一行写,有o就会有O,O是跳到上一行。

命令行模式下都可以敲哪些命令:
  /后写上你要查找的内容,比如/name,它会把光标定在找到的第一个位置,你可以按n往下找或者按shift+n往上找。
  数字0,快速的跳到行首,$是跑到当前行的末尾。
  yy就是复制一下当前行,把它粘贴到哪呢得上下键移动光标,平到某一个行位置,然后p,就会粘贴到某一行下面,P是粘贴到上一行。如果要复制多行,比如3行,就在要复制的第一行位置输入数字3,然后yy,左下角会提示你复制了三行。
  dd就是移动当前行,如果不执行p操作就相当于是删除。dd也可以剪切多行。
  如果我们后悔啦,就可以按u,还原上一次操作(撤销的意思),一直按一直返回,可以返回到文件最开始的样子。Ctrl+r是重做回来。
  G是快速把光标移动到整个文件末尾,gg是直接把光标移动到整个文件开头。3G是立马跳到第3行,也就是指定的行。
  H光标移动到整个屏幕的最上方那一行的第一个字符,M光标移动到整个屏幕的中央的那一行第一个字符,L光标移动到整个屏幕的最下方的那一行的第一个字符.

 在末行模式下都可以敲那些命令:

  查找/

  替换%s /要改的字符/改成什么字符/g   从第一行到最后一行寻找都替换掉。

 

vi和vim编辑器在编辑文件的过程当中,内容确实都是写到了内存当中,但是编辑器会把内容写到硬盘里面去。

 

vim的额外功能

  vim -O 文件1 文件2

  vim -o 文件1  文件2

  vimdiff 文件1 文件2   比对两个文件的差别

  diff -u 文件1  文件2  以文件1 为参照物,看一下文件2有何变动。

 

 

2、文本处理三剑客(awk、sed、grep)

  sed:非交互式编辑修改文本文件内容。

    称之为“stream editor”(流式编辑器),是因为它并不会将整个文件内容一次性读入内存,而是逐行读取并处理,然后继续处理下一行。这种方式使得sed能够在处理大型文件时依然保持高效。

  用法:

    在使用 sed 编辑特定文件时,需要在中间的脚本部分编写规则,这些规则需要用单引号括起来。规则包含两个主要部分:一是定位要编辑的内容,二是执行具体的编辑命令。

     定位的方式有以下几种:

        行定位:通过指定具体的行号来定位,多行用逗号分隔。

        正则定位:必须使用双斜杠包裹正则表达式来进行匹配。

        行定位和正则定位结合:在这种情况下,正则表达式将只匹配最近一次定位的行。

        指定具体的几行用;分隔开。比如sed '1p,2p,4p,7p' a.txt

        如果没有指定任何定位,则默认匹配所有行。

     命令:

       p 单纯的打印

       d 删除

       s///g 替换

       没有写命令就什么事也不做!!

     选项:

       -i  把输出到屏幕中的内容覆盖写如文件。

       -n 取消默认的打印行为。

       没有写选项

     结合到一起命令格式sed '定位+命令' 文件名 就是这么写:sed '1p' a.txt  sed '1,3d' a.txt

     sed默认输出打印。

     sed命令是支持管道符号的。ps aux |sed '1,78d'

  

awk:
  格式化输出,awk命令更擅长对有格式的文本文件进行一些处理。针对的是有规律的文本文件。

  语法:
    awk -F':' 'NR>=1 && NR<=3{print$1}' /etc/passwd
    awk 选项 处理规则 文件

  选项:
    -F:指定分隔符是什么,比如-F ':',如果不指定默认是以空格为分割符。

  规则:在单引号内写规则,规则分两部分,一部分是定位一部分是命令,知果果命令得写到花括号里。
    定位方式:
      行定位:NR是内置变量,会记录行号,比如要定位到第一行到第三行就这么写:NR>=1 && NR<=3,比如要定位前3行跟第5行之后的这么写:NR<=3 || NR>=5。
      正则定位:正则定位写到//(两个左斜杠)内。

  命令:
    print 打印命令,要写到花括号内:{print}

awk的运行逻辑:
  1、读入文本的一行内容进行处理:
    先把这一行内容整体赋值给一个变量$0;
    以:(冒号)为分隔符对该行进行分割
    分割完的第一行内容赋值给$1,第二段内容赋值给$2,以此类推; 第一列等于root的行: $1 == "root" 第一列是r开头的行: $1 ~ /^r/ !~ :不是
    把行号赋值给NR变量;
    把该行分的段数赋值给变量NF。每一行的最后一列就是$NF,倒数第二列就是$(NF-1)

2、执行规则

awk命令是支持管道符号的,sed处理的结果不是在文本文件里放着而是源自于一个命令输出的文本文件内容。

[root@localhost ~]# ps aux |awk 'NR<=10{print $1,$NF}'
USER COMMAND
root 22
root [kthreadd]
root [kworker/0:0H]
root [kworker/u256:0]
root [ksoftirqd/0]
root [migration/0]
root [rcu_bh]
root [rcu_sched]
root [lru-add-drain]
[root@localhost ~]# ps aux |head -10 |awk '{print $1,$NF}'
USER COMMAND
root 22
root [kthreadd]
root [kworker/0:0H]
root [kworker/u256:0]
root [ksoftirqd/0]
root [migration/0]
root [rcu_bh]
root [rcu_sched]
root [lru-add-drain]
View Code

 

grep命令:过滤文本或者过滤命令的结果。
  用法:
    grep 选项 正则 文件路径
    命令 | grep 选项 正则

  选项:
    -n 过滤的结果加上行号
    -i 忽略大小写
    -r 递归的过滤,主要是针对文件夹,会搭配一个-l,搭配一起写就是-rl,意思就是递归过滤某个文件夹,把匹配成功的文件路径展示出来
    -V 取反
  规则:在单引号内写正则

**扩写后的文章**---

`grep`** 命令:文本与命令结果的高效过滤工具**

`grep`(Global Regular Expression Print)是Linux和类Unix系统中强大的文本过滤工具,用于在文件内容或命令输出中快速搜索匹配指定正则表达式的文本行。它不仅能帮助用户快速定位关键信息,还可与其他命令结合使用,形成灵活的文本处理流程。

**基本用法**- **过滤文件内容**:`grep [选项] [正则表达式] [文件路径]`
例如:`grep 'error' /var/log/syslog` 会输出系统日志中包含 `error` 关键词的所有行。
- **过滤命令结果**:`[命令] | grep [选项] [正则表达式]`
例如:`ls -l /tmp | grep 'txt'` 可列出 `/tmp` 目录下所有文件名包含 `txt` 的文件。

**核心选项解析**- `-n`**:显示匹配行的行号**
对于需要定位错误日志或代码位置的场景非常有用。例如:`grep -n '404' access.log` 可显示访问日志中所有404错误对应的行号。
- `-i`**:忽略大小写匹配**
当关键词可能存在大写或小写变体时,使用 `-i` 可简化操作。例如:`grep -i 'user' config.txt` 会匹配 `User`、`USER` 等所有变体。
- `-r`** 或 **`-R`**:递归搜索文件夹**
搭配 `-l`(仅显示匹配文件路径)使用,可快速定位多个文件中的目标内容。例如:`grep -rl 'password' /etc` 会递归搜索 `/etc` 目录下所有包含 `password` 的文件路径。
- **其他实用选项**- `-v`:反向匹配,显示不包含关键词的行。
    - `-w`:仅匹配完整单词,避免误匹配子串。
    - `-c`:统计匹配行数量,而非输出内容。
    - `-A n` 或 `-B n`:显示匹配行后/前n行,便于上下文分析。

**正则表达式规则**- **必须写在单引号内**:`'正则表达式'`
单引号可防止Shell提前解析特殊字符(如 `*`、`$` 等),确保正则表达式正确传递到 `grep`。
- **基础正则语法示例**- `'^error'`:匹配以 `error` 开头的行。
    - `'log$'`:匹配以 `log` 结尾的行。
    - `'[0-9]{3}'`:匹配三位数字。
    - `'.\*\.log'`:匹配任意后缀为 `.log` 的文件名(需结合 `-w` 避免误匹配)。

**实际应用场景**1. **日志分析**:通过 `-r` 选项递归查找服务器日志中的错误信息(如 `grep -r 'Exception' /var/log`)。
2. **代码审计**:在项目中查找所有包含敏感关键词(如密码、密钥)的文件路径。
3. **系统配置检查**:快速确认某个配置文件是否包含特定参数(如 `grep -i 'port' nginx.conf`)。
4. **结合管道命令**:例如 `netstat -anp | grep 'ESTABLISHED'` 查看当前所有已建立的网络连接。

**注意事项**- 默认情况下,`grep` 仅支持基本正则表达式(BRE)。如需使用扩展正则(如 `+`、`?`),需使用 `egrep` 或 `grep -E`。
- 处理二进制文件时可能导致乱码,可使用 `grep --binary-files=without-match` 忽略二进制文件。
- 对于大文件或高频过滤任务,工具如 `ack`、`ag` 可能提供更快的搜索速度。

---

**扩展内容说明**1. 补充了 `grep` 的核心应用场景和实际案例,帮助用户理解其重要性。
2. 增加了对正则表达式语法的简要说明,降低使用门槛。
3. 扩展了注意事项和替代工具推荐,提升内容的实用性和全面性。
4. 通过分点结构优化可读性,使信息层次更清晰。

**总字数:约150%原文长度**,在保持技术准确性的同时,提供了更丰富的使用指导和扩展知识,适合初学者和日常运维人员参考。
View Code

 

posted @ 2025-05-14 15:16  张仁国  阅读(22)  评论(0)    收藏  举报
目录代码