grep/sed/awk

grep sed awk

  • grep:负责搜索
  • sed:(编辑)处理行,是一种在线编辑器,一次处理一行内容,处理时,把当前处理的行存储在零时缓冲区中,然后用sed命令处理缓冲区中的内容,处理完毕后,把缓存区的内容送往屏幕,然后转而执行下一行,这样不断重复,直到文件末端,这里的文件的内容并没有改变。

可以用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等。

  • awk:(内容分许并处理)处理列:倾向于将一行分成数个列来处理,其就是按逐行将文本读入,以空格为默认分割符将每行切片,切开的部分再进行各种分析处理。
#cat /etc/passwd 
root:x:0:0:root:/root:/bin/bash 
daemon:x:2:2:daemon:/sbin:/sbin/nologin 
bin:x:1:1:bin:/bin:/sbin/nologin
sys:x:80:80:desktop:/var/lib/menu/kde:/sbin/nologin 

只是显示/etc/passwd的账户
#cat /etc/passwd |awk  -F ':'  '{print $1}'  
root
daemon
bin
sys

显示多行
#cat /etc/passwd |awk  -F ':'  '{print $1"\t"$7}'
root    /bin/bash
daemon  /bin/sh
bin     /bin/sh
sys     /bin/sh

使用BEGIN END模块
#cat /etc/passwd |awk  -F ':'  'BEGIN {print "name,shell"}  {print $1","$7} END {print "blue,/bin/nosh"}'
name,shell
root,/bin/bash
daemon,/bin/sh
bin,/bin/sh
sys,/bin/sh
blue,/bin/nosh

实战

1. sort -u和uniq (混合使用),最好先用sort把所有重复的排序到一起,然后再用uniq去重,防止多次去重

uniq所谓的重复是连续出现的相同记录
- -c:在每行开头显示重复行出现的次数;
- -d:仅显示重复的列;
- -f 栏位:忽略指定的栏;
- -s N:指定可以跳过前N个字符;
- -w 字符位数:指定用于比较的最大字符数;
- -u:仅显示出现一次的行列;

2. cut 截取

  • N- 从第N个字符、字节、字段到结尾
  • N-M 截取N-M
  • -M 从第一个到M
  • -b字节
  • -c字符
  • -d指定分割符
  • -f,和-d配合使用,有了-d就必须有-f

3. wc 计算数字,可以帮助计算文件的字节数、字数或者是列数

  • -c或–bytes或——chars 只显示bytes数
  • -l或-lines:只显示列数
  • -w或——words:只显示字数

4. tr 对标准输入的字符进行替换、压缩和删除

  • -c或——complerment:取代所有不属于第一字符集的字符;
  • -d或——delete:删除所有属于第一字符集的字符;
  • -s或–squeeze-repeats:把连续重复的字符以单独一个字符表示;
  • -t或–truncate-set1:先删除第一字符集较第二字符集多出的字符

5. diff a b 求a与b不相同的文件

6. 从多个文件中统计IP的个数

转自:https://blog.csdn.net/u012270113/article/details/38711611

若干个文件如hostsAA_平台.cfg 、 hostsBB_服务.cfg/hostsCC_平台.cfg 、 hostsDD_服务.cfg、 hostsXX_平台.cfg,每个文件定义了很多主机数,每个主机配置定义格式如下:

 define host{
    use             linux-server
    host_name       AA-平台-济南
    alias           16.198.64.4
 }
ls host* | xargs cat | grep -E  "[0-9] + .[0-9] +.[0-9] +.[0-9]+" | awk '{print $2}' | uniq | wc -l

1.xargs 命令适用于管道命令不能使用的情况,本例中xargs命令将前面的输出作为cat的命令行参数。

2.grep -E "[0-9] + .[0-9] +.[0-9] +.[0-9]+",查找含有ip格式的字符串

3.awk '{print $2}',只打印输出一行记录的第二个被分割的域。即  address         16.198.64.4 这行数据的 16.198.64.4

你可能感兴趣的:(linux)