Linux(三)高级文本处理命令
一、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(三)高级文本处理命令的更多相关文章
- Linux学习之文本处理命令(五)
---恢复内容开始--- Linux 系统之文本处理命令 (一)基于关键字搜索 (二)基于列处理文本 (三)文本统计 (四)文本排序 (五)删除重复行 (六)文本比较 (七)处理文本内容 (八)搜索替 ...
- Linux文本文件——管理文本的命令
Linux文本文件——管理文本的命令 摘要:本文主要学习了在Linux中管理文本的命令. cat命令 cat命令用来显示文本文件的内容,也可以把几个文件内容附加到另一个文件中,即连接合并文件,是Con ...
- linux学习-常用文本处理命令
1.文本处理命令 (1) tr 转换或删除字符 tr [OPTION]...SET1 SET2 选项: -c 取SET1字符串的补集 -d 删除属于SET1中的字符 -s 把连续重复出现的字符以单独一 ...
- Linux中的高级文本处理命令,cut命令,sed命令,awk命令
1.2.1 cut命令 cut命令可以从一个文本文件或者文本流中提取文本列. cut语法 [root@www ~]# cut -d'分隔字符' -f fields ## 用于有特定分隔字符 [r ...
- Linux 高级文本处理命令
1.2.1 cut命令 cut命令可以从一个文本文件或者文本流中提取文本列. cut语法 [root@www ~]# cut -d'分隔字符' -f fields ## 用于有特定分隔字符 [ ...
- Linux高级文本处理命令
cut 一.cut命令 功能:cut命令可以从一个文本文件/文本流中提取文本列 语法: cut -d '分割字符' -f fields ##用于有特定分割字符 cut -c 字符区间 ##用于排列整齐 ...
- linux——高级文本处理命令之wc、cut、sort
1. wc :Word Count 命令的功能为统计指定文件中的字节数.字数.行数,并将统计结果显示输出 1.1 命令格式: wc [选项]文件... 1.2 命令参数: -c 统计字节数. -l ...
- linux下的文本处理命令sed&awk&grep
Sedsed 是个精简的.非交互式的编辑器.他能执行和编辑vi和emacs相同的编辑任务.sed编辑器不提供交互使用方式:只能在命令行输入编辑命令.指定文件名,然后在屏幕上察看输出.sed编辑器没有破 ...
- DA_06_高级文本处理命令
Linux中没有盘符这个概念,只有一个根目录“/”,所有文件都在它下面:点击计算机,下面存放的都是根目录下的东西: 2.6 文本文件编辑命令 1.cat 命令用于查看纯文本文件(内容较少的:一次性全部 ...
随机推荐
- Appium+python的单元测试框架unittest(3)——discover(转)
(原文:https://www.cnblogs.com/fancy0158/p/10047906.html) TestSuite套件可以添加很多个用例后运行,但是每个用例都需要调用addTest()函 ...
- Delphi 实现照片抽奖-原创
有单位年会要用照片抽奖,上网搜了几个都不满意,且居然还要收费.自己写一个算了.只是有一点不爽,Delphi 7 在 Windows 7 64位下有问题,不能双击 dpr 文件直接打开项目! 关于性能: ...
- [寒假学习笔记](一)Markdown语法学习
Markdown 学习 在博客园上使用markdown编辑,记录学习进度,以来日可以复习 前期准备 1. 安装markdownpad2 官网直接找下载安装,遇到bug他会自动提示信息,跟着提示去安装一 ...
- 亚马逊:PS4和Xbox One实在太火
圣诞节刚刚结束,当实体零售商在抱怨坑爹的天气让自己节日生意变得冷清的同时,在线零售商们却依旧赚的盆满钵满. 亚马逊近日表示,今年节日期间的零售工作非常不错,新一代游戏机更是最大的亮点.据销售统计,在圣 ...
- 2.hive里的增删改查
1.hive的增删改查 查询数据库 hive> show databases; OK default Time taken: 0.254 seconds, Fetched: 1 row(s) h ...
- CDOJ ABCDE dp(前缀和优化)
题目链接: http://acm.uestc.edu.cn/#/problem/show/1307 ABCDE Time Limit: 1000/1000MS (Java/Others)Memory ...
- Spring学习(五)——Spring注解(一)
---恢复内容开始--- 概述 注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作.如使用 JPA 注释配置 ORM 映射 ...
- ORACLE公司传奇历史
ORACLE公司传奇 ORACLE公司之起源 很难想象,ORACLE 公司的这一段传奇居然要从 IBM 公司开始. 1970年的6月,IBM 公司的研究员埃德加·考特 (Edgar Frank Cod ...
- 软工网络15团队作业4——Alpha阶段敏捷冲刺之Scrum 冲刺博客(Day1)
概述 Scrum 冲刺博客对整个冲刺阶段起到领航作用,应该主要包含三个部分的内容: ① 各个成员在 Alpha 阶段认领的任务 ② 明日各个成员的任务安排 ③ 整个项目预期的任务量(使用整数表示,与项 ...
- vue-cli脚手架搭建
我们使用vue-cli来搭建整个项目,vue-cli就是一个脚手架,步骤很简单,输入几个命令之后就会生成整个项目,里面包括了webpack.ESLint.babel很多配置等等,省了很多事 Vue+ ...