Linux 基本命令 (2) >和他的小伙伴 | grep sed

今天五一结束了 这个文章都已经写了好几天了都 每次都存在草稿箱里 昨天晚上还断网了。。。。 然后用了cmcc才传上去的那部分。。。。 然后我就想啊 要不先分开写吧 再合并起来 后来又想啊刚刚 都已经写了这一段了都 就别合并了吧 恩 就不合并了 就这样吧

6. >>和<< >和 2> 还有tee

这个吧 算不是命令 一般都是和其他的命令结合起来用的 >>和>用的比较多 表示输出重定向 例如ls >> heh 表示 列出文件目录 把列出的内容 输入到heh这个文件 屏幕上也不会显示 >>和>用法上一样的 >是覆盖文件内容 >>是在文件的末尾追加内容 如果既要写入到文件 又要显示在屏幕 就要用tee 这个命令用法 ls tee heh 一般用来作为日志的信息记录起来 至于2> 是把错误输出的内容重定向 前面那两个是把正常输出的内容重定向 例如 cat file >heh 2>heh2 如果存在file文件 就会读取这个文件 然后输入到heh里面 如果不存在file或者没有权限读取或者其他 cat出错了 如果没有2> 屏幕上还是会提示说文件不存在什么的或者其他的错误信息 但是用了2> 就会把这些错误信息输入到 heh2这个文件里面 然后屏幕上就什么都没有显示 还有个小窍门cat > heh 这样就可以在屏幕上用键盘文本然后写入到heh这个文件了 最后要用ctrl D结束输入 表示文件结束了 至于<<和< 是重定向输入 我也没用过 不知道什么用的 顺便提一下一个特殊的文件 /dev/null 这个是一个黑洞 无论什么东西输入进去都可以吞噬掉 比如说 某个命令会产生很多的提示 但是又没什么用的 不想占屏幕 就可以重定向到这里

7. | (管道)

管道 这个东西啊 神奇 功能和重定向输出我觉得差不多 重定向是把输出的东西定向到文件里 | 这个就是吧输出的东西定向到另外的命令里 这个之前在find 里面举过一个例子 我就举另外的例子好了 比如说在一个存字符界面里 要读取一个有点大的文件 一个屏幕都放不下的那么多 cat没法查看啊 就用less或者more来读取 翻页啊什么的 我还是比较喜欢less 好了 这是一个关于less的用法的说明 接下来是| 的例子 比如说 要查看的不是文件 比如 set (输入set这个命令可以查看到很多的配置 的东西 比如环境变量啊 各种东西) 直接输入set 屏幕显示一大片内容 一个屏幕放不下啊 解决方案有两个 一个是set >> heh && less heh 先把set的内容写到heh里面 然后用less读取 这个还要生成一个多余的文件 麻烦啊 另外一种方法是用管道set | less 把输出的东西通过管道发给less 用less打开 这个管道的一个不常用例子 更常用的还是和 接下来的这个命令grep结合起来一起用 还有 不是所有的命令都支持管道的 支持的被称为管道命令

8. grep

查找 这个东西 超级屌 算是非常高级的命令了我感觉 非常高冷 可以查找文件的内容 它是以行为单位的 grep 'heh' file 在file里面查找heh 显示出查找到的那几行的内容 这里用单引号比较好 支持正则表达式的哦 grep 还有一些参数 每个都很有用

  • -i 忽略大小写
  • -n 同时输出查找到的内容的行号
  • -v 反向 显示没查找到的行
  • -c 统计查找到的次数
  • -A2 -B3 同时列出查找到的前两行和后三行的内容 和正则表达式一起用

例子 查看 httpd.conf 里面的内容 因为里面包含了超级多的注释和空行 非常占屏幕 就用grep过滤一下看

1
grep   -v    '^#'   httpd.conf   |  grep  -v  '^$'   | less

首先过滤掉#开头的的行 吧结果通过管道输入到下一个grep 第二个grep把前面输入的内容进行操作 再过滤掉空行 把结果再通过管道传入下个命令 最后 用less查看最终的无空行无注释版的httpd.conf

9. sed

操作文本数据 这个命令很强大 而且有点复杂 基本的用法是 sed 参数 命令 文件
参数 有好几个 都是很有用的 -n 将操作了的行输出 如果不加 将会把操作后的整个文件都输出 -e 默认的参数 将结果输出到屏幕 -r 支持扩展正则表达式 反正我现在是不会 如果不写 只是支持基础正则 -i 和e相反 将操作后的数据直接写会文件 也就是直接操作文件的意思 这个就有点厉害了 第一次遇到能直接操作文件的命令
命令 也有好几个

  1. a 增加行
  2. c替换行
  3. d 删除行
  4. i插入 这个和a不一样 a是增加在下一行 i是插入在上一行
  5. p 输出行
  6. s 替换文本 这个是替换文本 可以用正则表达式
  7. c是把原来的行清空 换成另外的行

分别举个例子吧 不然看不明白

在heh文件的第一行下面加上一行 内容为 hhhhh

1
2
3
4
5
6
7
8
9
10
11
sed  -i   '1a  hhhhh'  heh 
```
把heh的第一行到第四行删除掉  $可以表示最后  
```bash
sed  -i   '1,4d'  heh
```  
c和i和p的用法也差不多 我就不写了  

把gogle  或者 google 或者 gooogle 等等等类似的匹配到的文本换成baidu
```bash
sed  -i  '1,3s/go+gle/baidu/'   heh

大概就这样吧 这命令 还有要注意 用单引号 其实加双引号单引号或者不加引号都是可以的 只是因为转义什么的原因 用单引号最好 比如要添加一行 内容是一个\
单引号版本

1
2
3
4
5
6
sed  -i '1a  \\'  heh
```  

双引号版本
```bash
sed  -i "1a  \\\\"  heh

就是四个 没有引号

sed  -i   1a\  \\\\    heh

原来引号里面的空格要转义 所以在a后面还有一个 空格后面反斜杠的转义也要用四个 这是因为 单引号的内容直接作为sed的参数传入 双引号和无引号的先作为终端的输入 先做转义 四个变成两个 然后转义完的两再作为sed的参数传入 这样就导致了 转义的问题 给人误导了
还有!! sed也是一个管道命令 可以和 | 一起用