Mrli
别装作很努力,
因为结局不会陪你演戏。
Contacts:
QQ博客园

Linux三剑客

2021/10/19 运维 Linux
Word count: 1,418 | Reading time: 6min

Linux三剑客

bash命令执行顺序

  1. 把命令行分成单个命令词
  2. 展开别名
  3. 展开大括号的声明({})
  4. 展开波浪符声明(~)
  5. 命令替换$0和")
  6. 再次把命令行分成命令词
  7. 展开文件通配(*、?、[abc]等等)
  8. 准备I/0重导向(<、>)
  9. 运行命令

文件查找

非实时搜索locate

速度快

  • 更新updatabase

实时搜索工具find

搜索速度略慢

精确查找

只能搜索用户具备读取和执行权限的目录

sed(Stream EDitor):

sed后字符使用单引号

语法:sed [-hnV][-e<script>][-f<script文件>][文本文件]

demo: sed -n '22,$p' test

指令解释:常用选项[-n],‘地址定界[22,$],编辑命令[p]’

地址定界:

  • 不给地址: 全文处理

  • 单地址

    • #: 指定行
    • $: 最后一行
    • /pattern: 正则匹配
  • 地址范围

    • #,#,如1,20即1-20行
      • e.g.sed -n '22,$p' test
    • #,+#,如2,+20即2-2+20 行
    • #;#3;5即第3和第5行
    • /pat1/,/pat2/
    • #,/pat1/
  • 步进~

    • 1~2 奇数行
      • sed -n "1~2p" f1
    • 2~2 偶数行
  • 正则

    • sed ‘/regex expression/[option] text’ filename

    • ^匹配每一行的开头

    • $匹配行的结尾

    • 匹配包含2、3、或者4的行

      • sed -n '/[234]/p' employee.txt
    • 删除所有以#开头的行

      • **sed -e 's/^#./*// ; /^$/d' employee.txt**
    • 删除所有注释和空行

      • sed -e 's/#.*//;/^$/ d' /etc/profile
    • 只删除注释行不删除空行

      • sed '/^#.*/d' /etc/profile

常用选项

  • -n不自动打印

  • -f 指定文件中读取编辑脚本

    • script.txt

      1
      2~2p

      sed -n -f script.txt f1

  • -r支持使用拓展正则表达式

    • sed -r 's/(GRUB_CMDLINE_LINUX.*)"$//1 xyz"/'/etc/default/grub
    • echo"/etc/sysconfig/network/" | sed -r 's/(.*//)([^/]//?$)//1/'
  • -i.bak生成备份文件bak并原处编辑

    • 如果没有-i表示只是预览,不会真正执行
  • -e多点编辑,即多次处理文件

  • -e <script>--expression=<script> 以选项中指定的script来处理输入的文本文件。

  • -E是与BSD sed兼容的未记录的选项,在BSD中sed用于支持扩展的正则表达式。

编辑动作命令

  • d删除末世空间匹配的行,并启用下一轮循环

    • sed -n 'd' test全删
    • sed -n '1d' test只删第一行
  • p打印当前模式空间内容,追加到默认输出后

  • a[/]test 指定行追加

  • i[/]test 行前插入

  • c[/]test 替换行为单行或多行

  • = 为模式空间中的行打印行号

    • sed -n ‘3,5{=;p}’ test
  • ! 模式空间中匹配行取反

  • w/path/somefile:保存模式匹配的行至指定文件
    r/path/somefile:读取指定文件的文本至模式空间中匹配到的行后

    • sed'/User/r sed.txt' .bashrc
  • 搜索代替

    • 1
      2
      3
      sed 's/xxx/xxx/' filename
      # sed 's@xxx@xxx' filename
      # sed 's#xxx#xxx' filename
    • 替换标记:
      g:行内全局替换
      p:显示替换成功的行
      W/PATH/TO/SOMEFILE:将替换成功的行保存至文件中

以下命令如果需要在文本中更改 需要加 -i 或者 -ri参数

用sed在aaa前加#注释

1
sed 's/^aaa/#&/' zimu.txt      # &的意思是匹配任意字符(就是说未知数,啥都行)  这条命令是 替换以aaa开头的

用sed取消bbb前面的注释

1
2
sed 's/^#(bbb)//1/' zimu.txt    #/1的意思 就类似于   前面的 (bbb/) /1就是复制这个位置的内容  如果有 第二个 那么久/2就是复制第二个位置的内容
sed 's/^#bbb/bbb/' zimu.txt

附录:

  • <<<:
    • sed 's/g/dddd/' <<< "ghhhg"->ddddhhhg
    • var=hello, sed 's/e/dddd/' <<< "$var" -> hddddllo

awk

优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一

ifconfig获得ip_addr的命令

1.ifconfig | grep inet | awk '{print $2}' | awk -F 'addr:' '{print $2}'

2.ifconfig | grep addr:192.168.* | awk '{print$2}' | awk '{split($0,a,/":/");print(a[2])}'

▲.尽量使用单引号'',而不是""

-F分隔符

e.g.echo "A|B|C|D" | awk -F "|" '{print($1)}'

NF列的个数

awk -F: '$3<10{print $1 <====> $NF}' /etc/passwd

{}中的内容为要要执行的内容

NR当前行号

linux单双引号区别

双引号:把双引号的内容输出出来;如果内容中有命令,变量等,会先把命令,变量解析出结果,然后再输出最终内容来。双引号内命令或变量的写法为命令或变量或$(命令或变量)

单引号:所见即所得,将单引号内的内容原样输出,阻止所有字符的转义

不加引号:不会将含有空格的字符串视为一个整体输出,如果内容中有命令,变量等,会先把命令,变量解析出结果,然后再输出最终内容来,如果字符串含有空格等特殊字符,则不能完整输出,则需改加双引号。

倒引号(反引号Esc键下方):进行命令的替换,在倒引号内部的shell命令将会被执行,其结果输出代替用倒引号括起来的文本。

echo "1111/n222"不会转移/n

echo -e "11111/n222"会转义/n

xargs -n1每行1个元素;xargs -n2 每行2个元素;

grep(Globally search a Regular Expression and Print)

一种强大的文本搜索工具,它能使用特定模式匹配(包括正则表达式)搜索文本,并默认输出匹配行

常见命令ps -aux | grep xxxx

选项与参数:

-a :将 binary 文件以 text 文件的方式搜寻数据

-c :计算找到 ‘搜寻字符串’ 的次数

-i :忽略大小写的不同,所以大小写视为相同

-n :顺便输出行号

-v :反向选择,亦即显示出没有 ‘搜寻字符串’ 内容的那一行!

-x --line-regexp : 只显示全列符合的列。

Author: Mrli

Link: https://nymrli.top/2019/08/30/Linux三剑客/

Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.

< PreviousPost
ACM-博弈论
NextPost >
2019_6月编程笔记
CATALOG
  1. 1. Linux三剑客
    1. 1.1. bash命令执行顺序
    2. 1.2. sed(Stream EDitor):
      1. 1.2.1. 常用选项
      2. 1.2.2. 编辑动作命令
    3. 1.3. awk
      1. 1.3.1. linux单双引号区别
    4. 1.4. grep(Globally search a Regular Expression and Print)