Linux命令之文本处理工具

Linux一切皆文件,因此对文本就会频繁操作,增删改查,也就有对文本处理的各种工具,下面介绍常用工具,以及各工具常用用法,常用案例等

一、文本的查看

1、cat -n 文件 加行号显示文本
-E 文件 显示回车符号
-A 文件 显示文本所有字符 $表示换行, ^I表示tab ,^M表示回车(一般win系统文本才有)
-s 文件 当遇到有连续两行以上的空白行,就代换为一行的空白行
-v windos上文本文件 显示非打印”显示控制字符除了LFD和标签使用` ^”具有高位设置的符号和前面字符“m”
cat file1 file2 >file3 把两个文件合并一个文件

举例:


image.png

-n用法


image.png

-E用法
image.png

-A用法
这个类似-E,显示多一些看不到的字符,ceshi.txt是在Windows下建立的文本


image.png

-s用法
image.png

-v用法
这个可以和-A结合理解记忆
image.png

用cat合并两个文件
image.png

2、tac 文件 倒着显示,是以行,颠倒显示


image.png

3、echo 字符 | rev 反向显示,是以列 左右倒着


image.png

4、less 分行显示
more 分页显示
这两个命令常用,一般和其它命令组合使用较多,比如查看很长的命令帮助文档,需要分页显示查看


image.png

image.png

按空格向下翻页查看

5、head -n 3 文件 显示文件前三行
-c 20 文件 显示头部20个字符


image.png

6、tail -n3 文件 显示文件后三行
-f 文件 动态观察文件 用于观察日志文件,监控文件
-F 文件 和f一样,多了文件被删除,会有提示


image.png

image.png

image.png

tailf类似tail -f
前者只在修改时监控扫描文件内容,不耗资源;后者频繁扫描监控文件内容,耗资源,因此一般都会用tailf

7、cut 取出特定列
cut -d: -f1,3 文件 以冒号为分隔符,取出内容第一和第三列
-d 指明分隔符 默认以tab为分隔符
--output-delimiter=" " 取出的列,以什么字符隔开
-f1 取第一列 混合使用:f1-3,7 第一列到第三列和第七列
-c 字符切割 一般列比较整齐的使用


image.png

image.png

paste file1 file2 两个文件 file1第几行对应file2第几行 左右对应显示显示
-s file1 file2 两个文件 file1第几行对应file2第几行 上下对应显示显示


image.png
image.png

练习------常用案例:
ss -nt | tr -s " " : | grep ESTAB | cut -d: -f6 取出和我对话的IP


image.png

df | grep /dev/sd | tr -s " " % | cut -d% -f5 取出磁盘利用率信息


image.png

cat /etc/passwd | head -n5 | cut -d: -f1,3 | tr ":" "-" 取出用户和UID


image.png

取当前主机指定网卡的IP:
ifconfig ens33 | grep netmask |tr -s " "| cut -d" " -f3 centos 7上


image.png

ifconfig eth0 | grep Mask |tr -s " " : | cut -d: -f4 centos 6上


image.png

生成指定位数的随机口令:
cat /dev/urandom | tr -dc '[:alnum:]' | head -c30
openssl rand -base64 30 | head -c30


image.png

二、文本的统计-分析

1、wc 文件 显示文件有几行,几个单词,几个字节
-l 文件 只统计行
-w 文件 只统计单词
-c 文件 只统计字节
-m 文件 只统计字符 一个汉字是一个字符、三个字节
-L 文件 只统计最长行的长度

image.png

image.png

2、sort -nr -t: -k3 文件 取出以冒号分隔的第三列按数字反向排序
-n 按数字排序
-t 按什么分隔符
-k 哪一列排序
-r 反向排序
-u 删除输出重复行

image.png

image.png

3、uniq 文件 相邻一样的合并输出显示
-c 文件 显示合并的字符有几个同样的
-u 文件 只显示不重复的
-d 文件 只显示重复的


image.png

练习------常用案例:
提取网站访问日志文件访问次数高的前十名
tr -s " " <access_log | cut -d" " -f1|sort |uniq -c | sort -n|tail

image.png

image.png

image.png

image.png

ss -nt 查询并发连接的远程IP最多的前三个IP
ss -nt | grep ESTAB | tr -s " " :|cut -d: -f6|sort|uniq -c|sort -nr |head -3|tr -s " " | cut -d" " -f3


image.png

image.png

image.png

比较文件
4、diff file1 file2 比较文件内容不同
-u

image.png

通过差异存档,可以恢复删掉的文件
diff f3 f4 -u >f8
rm f4
patch -b f3 f8
注意:系统没有装patch命令的包,需要取手动装一下
恢复的文件f4,会覆盖了f3,f3内容是原f4内容,原f3会生成一个备份文件

image.png

image.png

image.png

image.png

三、文本处理三剑客

grep sed awk 这里主要讲grep,其它两个后面单独一个命令写一篇

1、grep 行搜索并筛选
egrep=grep -E
fgrep=grep -F

grep 关键字 文件或目录
关键字可以是字符,可以是命令(用反向单引号扣起来命令),也可以引用变量(用双引号括起来或者不用)
-v 反选包含关键字以外的行

image.png

-i 忽略关键字大小写


image.png

-n 显示包括关键字的行以及行号
-c 匹配到关键字的行,有几行


image.png

-q 匹配到关键字的行,只是不显示(这种用法,后面用到,用处:只想知道匹配到还是没匹配到,匹配结果不关心)


image.png

-o 仅显示匹配到的关键字


image.png

-A n 包含关键字行的后n行也显示
-B n 包含关键字行的前n行也显示
-C n 包含关键字行的前后各n行也显示


image.png

-e 或关系,多个关键字筛选


image.png

-w 匹配关键字是一个词,不是一部分,除了数字、字母、下划线不可以作为单词的分隔符,其它键盘字符都可以


image.png

四、正则表达式

基本正则表达式:BRE
扩展正则表达式:ERE
正则表达式匹配的是内容里字符串

元字符分类:

1、字符匹配
. 一个任意字符串
[] 任意单一的字符
[^] 排除
[:alnum:] 数字和字母
[:alpha:] 字母
[:space:] 空格
[:digit:] 数字
[:loewr:] 小写字母
[:upper:] 大写字母
[:blank:] 空白字符

2、匹配次数
* 星号前面字符重复任意次,包括零次
.* 任意字符
\? 匹配前面字符重复0次或1次
\+ 匹配前面字符至少一次以上
\{n\} 匹配前面字符n次
\{m,n\} 匹配前面字符至少m次,至多n次
\{,n\} 匹配前面字符至多n次
\{n,\} 匹配前面字符至少n次

正则表达式涉及符号最好用引号引起来,不然有时会当作通配符用了

image.png

这个当成通配符a* 搜索针对的是ls传递过来包含a的文件名
这个是正则表达式"a*" 搜索针对的是ls传递过来的内容

3、位子锚定
^ 以什么开头的行 ^root
以什么结尾的行 bash
^$ 取空行
\< 词首以什么字符的行 \ <r
\> 词尾以什么字符的行 r\>
\<\> 匹配单词 \<root\>
\ 转义符

4、分组

\(\) 将一个或多个字符当作一个整体取处理,这就需要用到分组 (root)
\| 或者 a\|b a或者b \(A\|a\)b Ab或ab
echo axx bxx cxx | grep “\(a\|b\|c\)xx”
\n 后项引用,调用前面第n个括号里的正则表达式
例如:\(a..b\).*\(x..y\).*\1.*\2* 所以:\1=\(a..b\) \2=\(x..y\)

练习-----常用案例
扫描网段在用的IP,使用-B的的场景用法
-sP:ping扫描,仅发现目标主机是否存活
nmap -v -sP 172.18..2.0/24 | grep -B1 up | grep report | cut -d" " -f5


image.png

image.png

image.png

image.png

搜索筛选两个关键字包含的行 是或的关系
grep -e root -e wang /etc/passwd


image.png

判断主版本号
grep -o "[[:digit:]]+" /etc/centos-release |head -n1


image.png

取函数名
grep -o "^[[:alnum:]_]+[[:space:]]*()" /etc/init.d/functions


image.png

image.png

image.png

函数都是在开头,需要牟定行首


image.png

练习:
1、显示/proc/meminfo文件中以大小s开头的行(要求:使用两种方法)
grep "^[Ss]" /proc/meminfo
grep -i "^s" /proc/meminfo


image.png

2、显示/etc/passwd文件中不以/bin/bash结尾的行
grep -v "/bin/bash$" /etc/passwd


image.png

3、显示用户rpc默认的shell程序
grep "^rpc\>" /etc/passwd |cut -d: -f7


image.png

4、找出/etc/passwd中的两位或三位数
grep -o "\b[0-9]{2,3\}\b" /etc/passwd


image.png

image.png

需要牟定词首词尾,否者这个也被匹配


image.png

image.png

5、显示CentOS7的/etc/grub.conf文件中,至少以一个空白字符开头的且后面存非空白字符的行
grep "^[[:space:]]\+[^[:space:]]" /etc/grub.conf


image.png

6、找出“netstat -tan”命令的结果中以‘LISTEN’后跟任意多个空白字符结尾的行
netstat -tna |grep "LISTEN[[:space:]]*$"


image.png

7、显示CentOS7上所有系统用户的用户名和UID
cut -d: -f1,3 /etc/passwd |grep "\b[0-9]\{1,3\}$"


image.png

image.png

image.png

image.png

8、找出/etc/passwd用户名同shell名的行
grep "^\(.*\):.*\<\1" /etc/passwd grep "^\\(.\*\\)\\>.\*\\b\1" /etc/passwd

image.png

9、利用df和grep,取出磁盘各分区利用率,并从大到小排序
df |grep "/dev/sd" |grep -o "\<[[:digit:]]\{1,3\}%" |grep -o "[[:digit:]]\{1,3\}" |sort -nr


image.png

10、显示三个用户root、mage、wang的UID和默认shell
grep -o "^\(root\|mage\|wang\)\>" /etc/passwd|cut -d: -f3,7


image.png

11、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行
grep -o "^[[:alpha:]_]*()" /etc/rc.d/init.d/functions


image.png

12、使用egrep取出/etc/rc.d/init.d/functions中其基名
echo "/etc/rc.d/init.d/functions" |egrep -o "[^/]+/?$" |egrep -o ".*[^/]"


image.png

13、使用egrep取出上面路径的目录名
echo "/etc/rc.d/init.d/functions/" |egrep -o "^/./" |egrep -o ".[^/]"

image.png

14、统计last命令中以root登录的每个主机IP地址登录次数
last | grep "^root" |tr -s " " -|cut -d- -f3 |sort| uniq -c


image.png

15、显示ifconfig命令结果中所有IPv4地址
ifconfig ens33 |grep -o "([0-9]{1,3}.){3}[0-9]{1,3}" 点需要去转义


image.png

精确匹配
ifconfig ens33 |egrep -o "(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])"


image.png

16、将此字符串:welcome to magedu linux 中的每个字符去重并排序,重复次数多的排到前面
echo "welcome to magedu linux" | grep -o "[[:alpha:]]" |sort |uniq -c|sort -nr


image.png

17、用正则表达式表示出QQ号
[1-2][0-9]\{10\}
18、用正则表达式表示手机号
^1[3-9][0-9]\{9\}$

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文笔记源自这里——[实验楼]欢迎大家在下面交流其中有问题的地方喜欢请点收藏,每日更新(全部已亲自实践). 一. ...
    东皇Amrzs阅读 4,044评论 7 54
  • 第1章 小试牛刀 $ 是普通用户,# 表示管理员用户 root。 shebang:#!。sharp / hash ...
    巴喬書摘阅读 6,422评论 1 4
  • 系统信息 arch 显示机器的处理器架构(1)uname -m 显示机器的处理器架构(2)uname -r 显示正...
    jsondream阅读 558评论 4 13
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,237评论 2 33
  • 如平常一样,我起了个大早,神情恍惚地把朋友送我的面煮了,大概是国外的面我不太习惯,没煮熟,再加上调味料很...
    七月与小黑阅读 295评论 1 1