一、cut (cut 命令可以从一个文本文件或者文本流中提取文本列 )

1、cut语法

cut -d '分隔字符' -f fields         用于有特定分隔字符

cut  -c 字符区间                    用于排列整齐的信息

选项与参数:
             -d:后面接分隔字符。与 -f 一起使用
             -f:依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思
             -c:以字符 (characters) 的单位取出固定字符区间

2、例:

echo $PATH            /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

将 PATH 变量取出,找出第五个路径      echo $PATH | cut -d ':' -f 5                    /usr/sbin

将 PATH 变量取出,找出第三和第五个路径         echo $PATH | cut -d ':' -f 3,5                  /sbin:/usr/sbin

将 PATH 变量取出,找出第三到最后一个路径          echo $PATH | cut -d ':' -f 3-                  /sbin:/bin:/usr/sbin:/usr/bin:/root/bin

将 PATH 变量取出,找出第一到第三,还有第五个路径        echo $PATH | cut -d ':' -f 1-3,5          /usr/local/sbin:/usr/local/bin:/sbin:/usr/sbin

3、例

先准备已空格分开的这么段数据:
              huangbo 18 jiangxi
              xuzheng 22 hunan
              wangbaoqiang 44 liujiayao

获取中间的年龄: cut -f 2 -d ' ' sutdent.txt

18
             22
             44

获取第二个字符到第三个字符之间的字符:cut -c 2-3 sutdent.txt

ua
              uz
              an

二、grep

1、基本使用

查询包含hadoop的行      grep  hadoop  /etc/password

grep hadoop ./*.txt ## 寻找当前路径下的所有 txt 当中内容那些是带了 huangbo 字符串的

./mazhonghua.txt:my name is huangbo is is huangbo
                      ./sutdent.txt:huangbo 18 jiangxi

2、cut 截取以:分割保留第七段

grep hadoop /etc/passwd | cut -d: -f 7                                 /bin/bash

3、 查询不包含 hadoop 的行
              grep -v hadoop /etc/passwd

4、 正则表达包含 oo
              grep '.*oo.*' /etc/passwd
                         root:x:0:0:root:/root:/bin/bash
                         lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
                         mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
                         uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

5、 正则表达(点代表任意一个字符)          grep 'h.*p' /etc/passwd

6、 正则表达以 hadoop 开头                 grep '^hadoop' /etc/passwd

7、 正则表达以 hadoop 结尾                  grep 'hadoop$' /etc/passwd

正则表达式的简单规则:
                         . : 任意一个字符
                       a* : 任意多个 a(零个或多个 a)
                       a? : 零个或一个 a
                      a+ : 一个或多个 a
                       .* : 任意多个任意字符
                       \. : 转义.
                o\{2\} : o 重复两次

8、查找不是以#开头的行       grep -v '^#' a.txt | grep -v '^$'              ( '^$'代表空行)

hua$
                     liu
                     de

grep -v '^#' huangbo.txt

hua$
                    liu

de

9、以 h 或 r 开头的            grep '^[hr]' /etc/passwd

不是以 h 和 r 开头的       grep '^[^hr]' /etc/passwd
                不是以 h 到 r 开头的      grep '^[^h-r]' /etc/passwd

三、sed 命令

1、 删除: d 命令
            sed '2d' huangbo.txt -----删除 huangbo.txt 文件的第二行。
            sed '2,$d' huangbo.txt -----删除 huangbo.txt 文件的第二行到末尾所有行。
            sed '$d' huangbo.txt -----删除 huangbo.txt 文件的最后一行。
            sed '/test/'d huangbo.txt -----删除 huangbo.txt 文件所有包含 test 的行。

2、 替换: s 命令
            sed 's/test/mytest/g' huangbo.txt      ## 在整行范围内把 test 替换为 mytest。如果没有 g 标记,则只有每行第一个匹配的 test 被替换成 mytest。
            sed -n 's/^test/mytest/p' huangbo.txt      ## (-n)选项和 p 标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头 的 test 被替换成 mytest,就打印它。
            sed 's/^192.168.0.1/&localhost/' huangbo.txt
            sed -n 's/4444444/&test/gp' huangbo.txt      ## &符号表示追加一个串到找到的串后。所有以 192.168.0.1 开头的行都会被替换成它自已 加 localhost,变成 192.168.0.1localhost。

sed -n 's/\(love\)able/\1rs/p' huangbo.txt
            sed -n 's/\(wang\)www/\1test/p' huangbo.txt         ## love 被标记为 1,所有 loveable 会被替换成 lovers,而且替换的行会被打印出来。

sed 's#10#100#g' huangbo.txt                             ## 不论什么字符,紧跟着 s 命令的都被认为是新的分隔符,所以,“ #”在这里是分隔符, 代替了默认的“ /”分隔符。表示把所有 10 替换成 100。

选定行的范围:逗号
            sed -n '/test/,/check/p' huangbo.txt
            sed -n 's#4444444#bbbbbbb#gp' huangbo.txt        ## 所有在模板 test 和 check 所确定的范围内的行都被打印。

sed -n '5,/^test/p' huangbo.txt                  ## 打印从第五行开始到第一个包含以 test 开始的行之间的所有行。

sed '/test/,/check/s/$/sed test/' huangbo.txt         ## 对于模板 test 和 west 之间的行,每行的末尾用字符串 sed test 替换。
            多点编辑: e 命令
            sed -e '1,5d' -e 's/test/check/' huangbo.txt           ## (-e)选项允许在同一行里执行多条命令。如例子所示,第一条命令删除 1 至 5 行,第二 条命令用 check 替换 test。命令的执行顺序对结果有影响。如果两个命令都是替换命令,那 么第一个替换命令将影响第二个替换命令的结果。

sed --expression='s/test/check/' --expression='/love/d' huangbo.txt        ## 一个比-e 更好的命令是--expression。它能给 sed 表达式赋值。

3、 从文件读入: r 命令
           sed '/test/r file' huangbo.txt        -----file 里的内容被读进来,显示在与 test 匹配的行下面,如果匹配多行,则 file 的内容将显 示在所有匹配行的下面。
 
       4、 写入文件: w 命令
           sed -n '/test/w file' huangbo.txt         -----在 huangbo.txt 中所有包含 test 的行都被写入 file 里。

5、 追加命令: a 命令
          sed '/^test/a\\--->this is a example' huangbo.txt        ## '--->this is a example'被追加到以 test 开头的行(另起一行)后面, sed 要求命令 a 后面有一 个反斜杠。
       6、 插入: i 命令
         sed '/test/i\\some thing new -------------------------' huangbo.txt      如果 test 被匹配,则把反斜杠后面的文本插入到匹配行的前面。
       7、 下一个: n 命令
         sed '/test/{ n; s/aa/bb/; }' huangbo.txt     -----如果 test 被匹配,则移动到匹配行的下一行,替换这一行的 aa,变为 bb,并打印该行, 然后继续。

8、 退出: q 命令
         sed '10q' huangbo.txt         -----打印完第 10 行后,退出 sed。 
四、AWK

awk 是一个强大的文本分析工具,相对于 grep 的查找, sed 的编辑, awk 在其对数据分析并  生成报告时,显得尤为强大。简单来说 awk 就是把文件逐行的读入,以空格为默认分隔符 将每行切片,切开的部分再进行各种分析处理。 
    1、假设 last -n 5的输出如下

root pts/0 192.168.123.1 Wed Dec 28 01:55 still logged in
reboot system boot 2.6.32-573.el6.x Tue Dec 27 04:25 - 03:11 (22:46)
root pts/1 192.168.123.1 Tue Dec 27 02:00 - 02:00 (00:00)
root pts/1 192.168.123.1 Tue Dec 27 01:59 - 02:00 (00:00)
root pts/0 192.168.123.1 Tue Dec 27 01:59 - down (00:16)

2、只显示5个最近登录的账号           last -n 5 | awk '{print $1}'

root
reboot
root
root
root

awk 工作流程是这样的:读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔符 划分域,填充域, $0 则表示所有域,$1 表示第一个域,$n 表示第 n 个域。默认域分隔符是"空 白键" 或 "[tab]键",所以$1 表示登录用户, $3 表示登录用户 ip,以此类推
   3、 显示/etc/passwd 的账户:   cat /etc/passwd |awk -F ':' '{print $1}'

root
bin
daemon
adm
lp
这种是 awk+action 的示例,每行都会执行 action{print $1}。   -F 指定域分隔符为':'
   4、显示/etc/passwd 的账户和账户对应的 shell,而账户与 shell 之间以 tab 键分割                 cat /etc/passwd |awk -F ':' '{print $1"\t"$7}'

root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin

5、 如果只是显示/etc/passwd 的账户和账户对应的 shell,而账户与 shell 之间以逗号分割,而且 在所有行添加列名 name,shell,在最后一行添加"blue,/bin/nosh"。

cat /etc/passwd |awk -F ':' 'BEGIN {print "name,shell"} {print $1","$7} END {print "blue,/bin/nosh"}'
cat /etc/passwd | awk -F ':' 'BEGIN {print "name \t shell"} {print$1"\t"$7} END {print "blue,/bin/bash"}'
    结果:

name,shell
root,/bin/bash
daemon,/bin/sh
bin,/bin/sh
sys,/bin/sh
....
blue,/bin/nosh

awk 工作流程是这样的:先执行 BEGING,然后读取文件,读入有/n 换行符分割的一条记录, 然后将记录按指定的域分隔符划分域,填充域, $0 则表示所有域,$1 表示第一个域,$n 表示 第 n 个域,随后开始执行模式所对应的动作 action。接着开始读入第二条记录•直到所有的记
录都读完,最后执行 END 操作。

6、搜索/etc/passwd 有 root 关键字的所有行           awk -F: '/root/' /etc/passwd

root:x:0:0:root:/root:/bin/bash
这种是 pattern的使用示例,匹配了 pattern(这里是 root)的行才会执行 action(没有指定 action, 默认输出每行的内容)。
    7、搜索支持正则,例如找 root 开头的: awk -F: '/^root/' /etc/passwd
搜索/etc/passwd 有 root 关键字的所有行,并显示对应的 shell
awk -F':' '/root/{print $7}' /etc/passwd
/bin/bash
这里指定了 action{print $7}

8、统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容:

awk -F ':' '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd

awk -F':' '{print "filename:" FILENAME ",linenumber:" NR ",colums:" NF "linecotent:" $0}' /etc/passwd
      结果:

filename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash
filename:/etc/passwd,linenumber:2,columns:7,linecontent:daemon:x:1:1:daemon:/usr/sbin:/bin/sh
filename:/etc/passwd,linenumber:3,columns:7,linecontent:bin:x:2:2:bin:/bin:/bin/sh
filename:/etc/passwd,linenumber:4,columns:7,linecontent:sys:x:3:3:sys:/dev:/bin/sh

使用 printf 替代 print,可以让代码更加简洁,易读 
awk -F ':'  '{printf("filename:%s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}'    /etc/passwd

Linux(二)高级文本处理的更多相关文章

  1. deepin linux 学习笔记(二)——文本编辑器

    目录 deepin linux 学习笔记(二)--文本编辑器 前言 nano 小巧的命令行编辑器 通用 编辑 定位 排版 配置 vim 思路独特的超级编辑器 命令模式 插入模式 底线模式(末行模式) ...

  2. LINUX二十个基础命令

    LINUX二十个基础命令 一. useradd命令 1.命令格式: useradd 选项 用户名 2.命令功能: 添加新的用户账号 3.常用参数: -c comment 指定一段注释性描述.-d 目录 ...

  3. [.net 面向对象程序设计进阶] (3) 正则表达式 (二) 高级应用

    [.net 面向对象程序设计进阶] (2) 正则表达式 (二)  高级应用 上一节我们说到了C#使用正则表达式的几种方法(Replace,Match,Matches,IsMatch,Split等),还 ...

  4. Linux学习之文本处理命令(五)

    ---恢复内容开始--- Linux 系统之文本处理命令 (一)基于关键字搜索 (二)基于列处理文本 (三)文本统计 (四)文本排序 (五)删除重复行 (六)文本比较 (七)处理文本内容 (八)搜索替 ...

  5. Linux 正则表达式与文本处理器 三剑客

    Linux 正则表达式与文本处理器 三剑客 一.正则表达式 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则. 在linu ...

  6. sqlalchemy(二)高级用法

    sqlalchemy(二)高级用法 本文将介绍sqlalchemy的高级用法. 外键以及relationship 首先创建数据库,在这里一个user对应多个address,因此需要在address上增 ...

  7. Linux环境高级编程--介绍

    从今天開始.将开启Linux环境高级编程(Advanced Programming Of Linux Enviroment)的学习笔记或者说总结,我将持续和大家分享自己的学习成果.本系列博客依托于li ...

  8. css渲染(二) 文本

    一.文本样式  首行缩进 text-indent 首行缩进是将段落的第一行缩进,这是常用的文本格式化效果.一般地,中文写作时开头空两格.[注意]该属性可以为负值:应用于: 块级元素(包括block和i ...

  9. Linux常用命令——文本编辑器Vim

    Linux常用命令--文本编辑器Vim Linux  Vim常用操作 插入命令 a 在光标所在字符后插入 A 在光标所在行尾插入 i 在光标所在字符前插入 I 在光标所在行首插入 o 在光标下插入新行 ...

  10. sed——linux下对文本当控制操作(替换,追加)

    sed——linux下对文本当控制操作(替换,追加) 2011-12-12 19:27:17 分类: LINUX Linux下sed命令 1. Sed简介 sed 是一种在线编辑器,它一次处理一行内容 ...

随机推荐

  1. 【扯淡篇】CTSC/APIO/SDOI R2时在干什么?有没有空?可以来做分母吗?

    注意: 我比较弱, 并没有办法把外链bgm搞成https, 所以大家可以选择"加载不安全的脚本"或者把https改成http以获得更好的阅读体验! 据说, 退役了要写写回忆录. 但 ...

  2. codeforces1139E Maximize Mex 二分图匹配

    题目传送门 题意:给出n个人,m个社团,每个人都有一个标号,一个能力值,并且属于一个社团,第i天的凌晨,第$k_i$个人会离开.每天每个社团最多派一个人出来参加活动.派出的人的能力值集合为S,求每天$ ...

  3. 微信小程序分享功能的path路径

    表示被微信小程序坑惨了 糟心的开始写,老板说先不上太复杂,就先显示了两个页面,然后开开心心的发布,测试了几遍,没啥问题呀.结果,一上上去,就被老板批了! 啥呀! 这分享怎么这个鬼样子!明明我看文档都是 ...

  4. Vue 一些零零散散~

    1. F5刷新不会触发vue的destroyed事件. 2. computed 的 vuex 数据 ------>   beforeCreated: undefined   /    creat ...

  5. Hadoop(二)HDFS

    海量数据处理 分而治之 核心思想: 把数据分发到多个节点 移动计算到数据附近 计算节点进行本地数据处理 优选顺序,次之随机读 一.HDFS概述 修改,先删除,再重新生成 1.架构 namenode维护 ...

  6. Clickhouse集群部署

    1.集群节点信息 10.12.110.201 ch201 10.12.110.202 ch202 10.12.110.203 ch203 2. 搭建一个zookeeper集群 在这三个节点搭建一个zo ...

  7. Boost Download

    { //https://www.boost.org/users/history/version_1_71_0.html }

  8. Delphi max函数和min函数

    uses单元 math: min函数  min(A,B); 比较A.B的大小,取最小值 max函数  min(A,B); 比较A.B的大小,取最大值 原型示例:function Min(const A ...

  9. PHP ftp_exec() 函数

    定义和用法 ftp_exec() 函数请求在 FTP 服务器上执行一个程序或命令. 如果成功,该函数返回 TRUE.如果失败,则返回 FALSE. 语法 ftp_exec(ftp_connection ...

  10. vue2 核心概念

    一.vue变量 所有的 vue变量 ,必须在data:中有注册(哪怕内容是空,相当于声明这个是变量,是vue变量而不是js变量).这里的变量也可以运算.(注意:所有的框架一定要注意js变量和框架的变量 ...