系统学习----Linux文本三剑客

Linux文本三剑客

grep:文本过滤(模式匹配工具)
sed: 文本流编辑工具
awk: 文本报告生成器

grep命令

常用选项:
–color=auto : 对匹配到的文本着色显示
-v: 显示不能够被pattern匹配到的行
-i:忽略大小写
-o:仅显示匹配到的字符串
-q:静默模式,不输出任何信息
-A #: after 后#行
-B #: before 前#行
-C #: context 前后各#行
-E : 使用ERE(使用扩展正则表达式) 等同于egrep

  • 练习题答案
    1.显示/proc/meminfo文件中以大小s开头的行(2种方式)
    reg: ^[Ss]
grep "^[Ss]" /proc/meminfo 
grep -i "^s" /proc/meminfo

2.显示/etc/passwd文件中不以/bin/bash结尾的行
reg: /bin/bash$

grep -v "/bin/bash$" /etc/passwd 

3.如果root用户存在,显示其默认的shell程序 位置锚定

[root@test tmp]# id root > /dev/null && grep "^root\>" /etc/passwd | cut -d: -f7

4.找出/etc/passwd中的两位或三位数 ; 贪婪匹配 --> 继续往后匹配
reg: [[:digit:]]{2,3}

[root@test tmp]# grep "\<[[:digit:]]\{2,3\}\>" /etc/passwd
[root@test tmp]# grep "\<[0-9]\{2,3\}\>" /etc/passwd
[root@test tmp]# grep -E "\<[0-9]{2,3}\>" /etc/passwd		-- 使用ERE

5.显示/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面存非空白字符行
reg : [[:space:]]+[[:space:]]\

[root@test tmp]# grep "^[[:space:]]\+[^[:space:]]\+" /etc/grub2.cfg

6.找出“netstat -tan"命令的结果中以’LISTEN’后跟0、1或多个空白字符结尾的行
reg: LISTEN[[:space:]]*$

netstat -tan | grep "LISTEN[[:space:]]*$"

7.添加用户bash、testbash以及nologin(其shell为/sbin/nologin),然后找出/etc/passwd文件中用户名同shell名的行

useradd bash && useradd testbash && useradd nologin -s /sbin/nologin
		bash:x:1010:1013::/home/bash:/bin/bash
		nologin:x:1012:1015::/home/nologin:/sbin/nologin
		
reg: [[:alnum:]]\+

扩展正则:

[root@test tmp]# grep -E "^(\<[[:alnum:]]+\>).*\1$" /etc/passwd	

基本正则:

[root@test tmp]# grep "^\(\<[[:alnum:]]\+\>\).*\1$" /etc/passwd

\1 : 引用分组的内容;保证用户名和shell同名

awk方式:

[root@test tmp]# awk -F'[:/]' '$1==$NF{print $0}' /etc/passwd

sed命令

Sed: 文本流编辑器; 非交互式,能同时处理多个文件多个行的内容,
不对源文件改动,把整个文件输出到屏幕;还可以对源文件改动,但是不会在输出到屏幕上返回结果

语法格式:

[root@test tmp]# sed --help
Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...

sed的命令格式: sed [options] ‘sed command’ filename
sed的脚本格式: sed [options] -f ‘sed script’ filename

常用选项:
-n : 只打印模式匹配的行
-e :直接在命令行模式上进行sed动作编辑(默认选项)
-f : 将sed的动作写在一个文件中,用-f “sed script” 执行 script文件中的sed动作
-r :支持扩展正则表达式
-i :直接去修改文本内容


查询文本的方式:

使用行号和行号范围
	x: 行号
	x,y : 从x,y行 
	x,y! : 从x,y行之外
	/pattern : 查询包含模式的行
	/pattern/,/pattern/ : 查询包含两个模式的行
	/pattern/,y : y行内查询包含匹配模式的行
	x,/pattern/: x行后查询包含匹配模式的行

编辑命令:

p : 打印匹配的行
= :  显示文件行号
a\:  指定行号后添加新文本
i\:  指定行号前添加新文本
d: 删除定位行
c\: 用新文本内容替换定位到的行
w filename: 写文本到另一个文件中
r filename: 读另一文本到本文件中
s /// : 替换
	替换标记: 
		g: 行内全局替换
		p:显示替换成功的行
		w:将替换成功后的内容保存到指定文件中
		
	分隔符: /// --> @@@作为分隔符也是可以的
	
	
q: 第一个模式匹配后立即退出
{}: 在定位执行行的命令组,用;进行分隔
g: 将模式2粘贴到/pattern n/ 位置 

实例:

  1. 只打印文本的第1到4行内容
[root@test tmp]# sed -n '1,4p' fstab 
  1. 只打印文本中包含xfs的行
[root@test tmp]# sed -n '/xfs/p' fstab	
  1. 只打印文本中以UUID开头的行
[root@test tmp]# sed -n '/^UUID=.*/p' fstab 	
  1. 显示文件中以UUID开头行的行号
[root@test tmp]# sed -n '/^UUID=.*/=' fstab 
  1. 在/etc/hosts文件中第3行位置添加主机名解析内容
[root@test tmp]# sed -i '2a\192.168.10.10 node1' /etc/hosts
  1. 删除上述添加的解析内容
[root@test tmp]# sed -i '3d' /etc/hosts
  1. 替换以UUID开头行的内容
[root@test tmp]# sed -i '/^UUID=.*/c\test......' fstab
  1. 将fstab文件中以#开头的所有内容保存至fstab_part文件中
[root@test tmp]# sed '/^#.*/w fstab_part' fstab
  1. 将fstab_part文件内容读写到1.txt文件中第2行以后位置
[root@test tmp]# sed -i '2r fstab_part' 1.txt 

10.将1.txt文本中hello替换成全局替换成大写

[root@test tmp]# sed -i 's/hello/HELLO/g' 1.txt 

将替换的内容保存至1_part.txt文本中

[root@test tmp]# sed 's/HELLO/Hi/g w 1_part.txt' 1.txt 

注意事项: 在进行编辑操作的时候,尽量先默认在命令行输出;保证正确的情况下,再使用-i参数对其文本进行修改


  1. 显示/etc/passwd文件中位于第偶数行的用户的用户名
	sed -n 'n;p' /etc/passwd | cut -d: -f1
  1. 为/tmp/1.txt 文件中前三行的行首加#号。
	sed -i '1,3s@\(^.\)@#\1@g' /tmp/grub.conf
	1,3s@\(^.\)@#\1@g

取消注释行:

 sed '1,10s@^#\(.*\)$@\1@g' 1.txt 

^#+(.*)$ —> 查询内容:所有#开头的行

\1 替换的内容 (.*)

awk命令

awk是一个文本分析工具,相对于grep的查找,sed的编辑,awk优势在于对数据分析后形成的报告
简单来说: awk就是文本逐行读入,以空格为模式分隔符进行切片,切片部分再进行各种分析处理

[root@test tmp]# awk --help
Usage: awk [POSIX or GNU style options] -f progfile [--] file ...
Usage: awk [POSIX or GNU style options] [--] 'program' file ...

常用选项:
-F: 指定分隔符
-v:指定用户定义变量
-f:从脚本文件读取awk命令

  • pattern:
    模式可以是以下任意一种:
    正则表达式: 使用通配符的一些扩展集
    关系表达式: 使用运算符进行操作,可以是字符串或者数据的比较测试
    模式匹配表达式 :用运算符 ~(匹配) 和 ~!(不匹配)
    BEGIN 语句块, pattern语句块,END语句块

  • action:
    动作: 由一个或多个命令、函数表达组成;之间用逗号分隔开来,并位于大括号之内
    主要部分是:变量 数组赋值 输出命令 内置函数 控制流语句等等

awk常见用法:

  1. 以:号为分隔符,输出/etc/passwd的第一字段内容
[root@node1 ~]# awk -F: '{print $1}' /etc/passwd
[root@test tmp]# awk -F: '{print $1"用户shell为:"$7}' /etc/passwd

$0: 代表整行内容

  1. 匹配模式:关系表达式:条件为GID为996 动作:用户名称
[root@node1 ~]# awk -F: '$4==188 {print $1}' /etc/passwd
  1. 匹配模式:正则表达式: 以test为开头的行 动作: 输出 用户名和组id
[root@node1 ~]# awk -F: '/^test/{print $1,$4}' /etc/passwd
  1. 传递变量 动作:输出 用户名称 和 组ID
[root@node1 ~]# awk -F: -va=3 '{print $1,$1+$a}' /etc/passwd
  1. 匹配模式: BEGIN和END语句
[root@node1 ~]# awk  -F:  '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd
[root@node1 ~]# awk -F: 'BEGIN{print"-------------------------\n"}{printf "username:%-16s\tsuserid:%-16s\n",$1,$4}END{printf N "%-4s records\n",NR}' /etc/passwd

使用-F指定分隔符,-v传递变量参数,输出时有print和printf格式化输出,并且输出多列用,号分割,并且添加BEGIN和END字段。

BEGIN语句块是awk分析处理前做的事情;END语句块是awk分析处理后做的事情

awk运算符:

算数运算符: + - * /
赋值运算符: = += ..
逻辑运算符:  || &&
关系运算符:  == != > < 
正则运算符: (~,~!)  ---> (匹配正则表达式,不匹配正则表达式)

awk内置变量

NR:已读的记录数  -- 行数
NF:浏览记录的域的个数 --- 列数(字段数)
ARGC: 命令行参数个数
ARGV: 命令行参数排序
FILENAME: awk浏览的文件名称
FNR: 浏览文件的记录数
FS: 设置输入域分隔符,等价于命令-F选项
.....

条件和循环语法:

if (condition) action
if (condition) action else action
for (initialisation; condition; increment/decrement) action
while (condition) action
break:用以结束循环
Continue:语句用于在循环体内部结束本次循环,从而直接进入下一次循环迭代

数组:

数组使用的语法格式:array_name[index]=value
删除数组:delete array_name[index]
多维数组

函数:
https://www.runoob.com/w3cnote/awk-built-in-functions.html#b2

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值