linux三剑客和管道使用

管道符|

  • 管道符将两个命令隔开,管道符左边命令的输出作为管道符右边命令的输入

grep命令

  • 对文件中的行进行正则匹配过滤
  • grep [option] pattern file
  • 正则表达式
    • 记录文本规则的代码,正则表达式匹配文本中的字符串
    • 常用的元字符
      • . 匹配除换行符以外的任意字符
      • \w 匹配字母或者数字或下划线或汉字
      • \s 匹配任意空白符
      • \d 匹配数字
      • \b 匹配单词的开始或结束
      • ^ 匹配字符串的开始
      • $ 匹配字符串的结束
    • 常用的限定符
      • * 重复零次或更多次
      • + 重复一次或更多次
      • ? 重复零次或一次
      • {n} 重复n次
      • {n,} 重复n次或更多次
      • {n,m} 重复n到m次
  • 常用参数
    • -v 显示不被模式匹配的行
    • -i 忽略字符大小写
    • -n 显示匹配的行号
    • -c 统计匹配的行数
    • -o 仅显示匹配到的字符串
    • -E 使用ERE,相当于egrep
      • 基本正则表达式(BRE)和扩展正则表达式(ERE)的区别仅仅是元字符(meta charactor)的区别而已
      • BRE: 只有^$.*[]是元字符
      • ERE: ^$.[]*+(){}?|都是元字符

sed命令

  • 对文件中的行进行流编辑,不会影响原有的文件内容
  • sed [-hnV][-e(script)][-f(script文件)][文本文件]
    • -e(script)或--expression=(script) 以选项中指定的script来处理输入的文本文件。
    • -f(script文件)或--file=(script文件) 以选项中指定的script文件来处理输入的文本文件。
    • -h或--help 显示帮助。
    • -n或--quiet或--silent 仅显示script处理后的结果。
    • -V或--version 显示版本信息
  • script动作说明
    • a :新增, 某行后面新增一行,例如sed -e '4a newline' test.txt
    • i :插入, 某行前面新增一行,例如sed -e '4i newline' test.txt
    • c :取代, 可以取代n1,n2之间的行,例如sed -e '4,6c oldline\nnewline' test.txt
    • s :取代,可以搭配正则,例如sed -e '1,20s/old/new/g' test.txt,/g表示全局替换,不加/g表示替换每一行中的第一个匹配到的字符串
    • d :删除,可以取代n1,n2之间的行,例如sed -e '4,6d' test.txt
    • p :打印,将某个选择的数据印出,通常p会与参数 sed -n一起运行,例如sed -n '/root/p' test.txt,//里面是正则-
  • -i参数直接修改文件内容,例如sed -i 's/old/new/g' test.txt

awk命令

  • 把文件逐行读入,以空格为默认分割符将每行切片,切分成不同的列,切开的列再进行后续处理
  • $0是读取的整行内容,$1是第一列
  • awk 'pattern + action' filenames,pattern就是正则表达式,action对匹配到的内容执行的命令(默认为输出每行内容)
    • -F fs:fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:
    • -v var=value:赋值一个用户定义变量,将外部变量传递给awk
    • -f scripfile:从脚本文件中读取awk命令
  • 内置变量
    • FILENAME awk浏览的文件名
    • BEGIN 处理文本前要执行的操作
    • END 处理文本后要执行的操作
    • FS 输入列分隔符,等价于-F,默认为空白字符
    • OFS 输出列分隔符,默认为空白字符
    • RS 输入行分割符,指定输入时的换行符,原换行符仍有效
    • ORS 输出行分割符,输出时用指定符号代替换行符
    • NF 列数,$NF引用最后一列,$(NF-1)引用倒数第2列
    • NR 行数
    • $0 整条行内容
    • $1 表示当前第一列
  • 冒号为分割符,匹配root的行,打印第7列
    awk -F : '/root/{print $7}' /etc/passwd
    
  • 指定第二行,打印整个行
    awk 'NR==2{print $0}' /etc/passwd
    
  • 使用begin加入标题
    awk -F : 'BEGIN{print "BEGIN BEGIN"} {print $1,$2}' /etc/passwd
    
  • 以|为标志分割行
    echo '111 222|333 444|555 666' | awk -v RS='|' '{print $0}'
    
  • 计算文件大小
    ls -l *.txt | awk '{sum+=$5} END {print sum}'
    
posted @ 2020-10-07 21:54  iread9527  阅读(131)  评论(0编辑  收藏  举报