Linux 三剑客

Linux三剑客是指的grep、sed、awk

一、grep

一种强大的文本搜索工具,用于在文件内容中查找指定的字符串,并将匹配到的行输出到标准输出。以下是grep命令的基本使用方法:

基本语法:
grep [选项] 模式 [文件...]

常用选项:
-i:忽略大小写。
-v:反转匹配,显示不匹配模式的行。
-r 或 -R:递归搜索。
-l:仅显示匹配的文件名。
-n:显示匹配行的行号。
-c:计数,显示匹配的行数。
-e:指定多个搜索模式。
-f:从文件读取模式。
常用模式匹配:

a:匹配字母a。
^:匹配行的开头。
$:匹配行的结尾。
.:匹配任意单个字符。
*:匹配前面的字符0次或多次。
[]:字符集合,例如[abc]匹配a、b或c。
[^]:字符排除集合,例如[^abc]匹配除a、b、c之外的任意字符

1.查找指定字符串的前后n行

grep -A 100 -B 100 "要查找的字符串" 被查找的文件
 
-A after 后面
-B before 前面

2.查找指定字符串

# 在文件中搜索指定字符串
grep "string" filename.txt
# 这个命令会搜索filename.txt文件中所有出现"string"的行,不区分大小写

# 查找指定字符串出现的行
grep -n "要查找的字符串" 被查找的文件

#在多个文件中搜索字符串
grep "string" file1.txt file2.txt

# 递归地搜索/path/to/directory/目录及其子目录中的所有文件,查找包含"string"的行
grep -r "string" /path/to/directory/

3.查找指定字符出现为止的上下n行

grep -C n "要查找的字符串" 被查找的文件
#显示文件中匹配字符串所在行的上下n行,相比较1,优先使用本用法

# 统计filename.txt文件中包含"string"的行数
grep -c "string" filename.txt

4、多条件查找

# OR 条件  \|表示 OR 条件
grep 'apple\|banana' file.txt

# AND 条件 -e选项表示指定一个搜索模式,可以多次使用来指定多个模式
grep -e 'apple' -e 'pie' file.txt

# NOT 条件 查找不包含“apple”的行
grep -v 'apple' file.txt

5、正则表达式

# .*表示匹配任意字符,正则表达式中的竖线符号|不需要转义
# 查找同时包含“apple”和“pie”(中间可以有任意字符)的行
grep 'apple.*pie|pie.*apple' file.txt

# 搜索filename.txt文件中所有以"string"开头的行。-E选项表示启用正则表达式模式
grep -E "^string" filename.txt

二、sed

sed是一个流编辑器,用于对输入流(或文件)进行基本的文本转换。它经常被用于脚本和自动化任务中,以执行基本的文本替换、删除、插入和其他编辑操作

1、基本语法
sed [options] 'command' file
# 其中,options是可选的,用于指定sed的行为;command是你要执行的编辑命令;file是要处理的文件或输入流。
2、示例

1、查找文件中的5到10行

sed -n "5,10p" 被查找的文件

2、apple替换成orange,末尾是指定替换操作的行为,没有 g 标志,只替换每一行中的第一个匹配到的 “apple”,而不会进行全局替换

sed 's/apple/orange/g' file.txt

3、删除

# 删除包含"error"的行
sed '/error/d' file.txt

#删除file.txt文件中第3行的内容
sed '3d' file.txt

4、插入和追加行

# 在所有包含"header"的行之前插入新行 i\
sed '/header/i\This is a new line' file.txt

# 在所有包含"header"的行之后插入新行 a\
sed '/apple/a\This is a new line' file.txt

在file_path文件中第4行之后添加add_text字符串
sed '4a\add_text' file_path

5、在每行的末尾添加一个新行

sed 's/$/\n/' file.txt > file_new.txt

6、其他

选项:sed有许多选项可以调整其行为,例如:
-n:只打印模式空间中由显式打印命令指定的行
-i:直接修改文件,而不是输出到标准输出

-e script或--expression=script:指定额外的编辑脚本
# 示例:在文件中将所有"apple"替换为"orange",并直接修改文件,可以使用以下命令:
sed -i 's/apple/orange/g' file.txt

# 多个命令组合:使用“-e”选项可以将多个sed命令组合起来执行
sed -e 's/old_string/new_string/g' -e '3d' file_path

标签和分支:使用标签和分支可以实现复杂的替换和删除操作
例如:sed '/pattern/{s/old_string/new_string/g;d}' file_path,表示在匹配pattern的行中将old_string替换为new_string,并删除该行

从文件中读取命令:使用“-f”选项可以从指定文件中读取sed命令
例如:sed -f sed_cmds.txt file_path

三、awk

1、基本语法

awk是一个强大的文本分析工具,它使用一种类似于编程的语言来处理文本文件和字符串。通过使用awk,用户可以对数据进行筛选、格式化和转换等操作

2、示例

打印行:使用print命令可以打印匹配模式的行

# 打印所有包含"error"的行
awk '/error/ { print }' file.txt
awk '/error/' file.txt

# 打印第二行第四列的内容
awk 'NR==2 {print $4}' filename
# 倒数第2行(先获取最后一行数据,再获取它的上一行),处理大数据文件较快,类似操作: tail -n 2 file.txt, line是一个数组
awk '{ line[NR] = $0 } END { print line[NR-1] }' file.txt

# 打印最后一行倒数第二列内容
awk 'END{print $(NF-1)}' file.txt

# 查看文件全部内容
awk // tmp.txt
# 不输入空行
awk 'NF' file.txt

# 打印输入流中包含特定字符串的行
awk '/pattern/ { print }' filename.txt

替换操作:使用sub或gsub命令可以在匹配模式的行中进行替换操作

# 将所有"apple"替换为"orange
awk '{ gsub(/apple/, "orange"); print }' file.txt

数学运算:使用内置的数学函数可以进行数学运算

# 计算每行中的数字之和
awk '{ sum = $1 + $2; print sum }' file.txt

# 计算文件中列的总和
awk '{ sum += $1 } END { print sum }' filename.txt

条件语句:使用if、else和while等语句可以根据条件执行不同的操作

# 打印大于10的数字
awk '$1 > 10 { print }' file.txt

# 通过判断的方式获取3~6行
awk 'NR>=3 && NR<=6' file.txt

# 打印第1列5-9的值
seq 10 |awk '$1 > 5 && $1 < 9

分割操作:使用内置的字段分割功能可以对每一行进行分割操作

# 打印每个字段的内容
awk '{ for (i = 1; i <= NF; i++) print $i }' file.txt
选项:awk有许多选项可以调整其行为,例如:
-F:指定字段分隔符
# 使用冒号作为字段分隔符
`awk -F':' '{ print $1 }' file.txt`

-f:从文件中读取awk程序
# 从文件script.awk中读取awk程序,可以使用以下命令:
`awk -f script.awk file.txt`

-n:强制awk读取输入,即使没有模式或动作
# 强制awk读取文件,即使没有模式或动作
`awk -n 'BEGIN { print "Hello, World!" }' file.txt`

-v:设置变量的值
# 设置变量name的值为"John"
`awk -v name="John" '{ print name }' file.txt`

基本用法

# awk基本用法,默认空格或tab为分隔符:^开头, $结尾
# 打印输入流中每一行的第一个字段
awk '{ print $1 }' filename.txt
awk '/条件/{操作}' file  # awk 'pattern { action }' file
# inet行的最后一列
ifconfig ens32 | awk '/inet/{print $NF}'
# 打印第6列tom结尾的第1行内容
awk -F: '$6~/tom$/{print $1}' passwd
# 打印第3列等于3的第1列内容
awk -F: '$3=="3"{print $1}' test


# if判断
awk '/条件/{ 如果(条件1){操作1} 否则(条件2){操作2} 再否则(条件3){操作3} }'
awk -F: '/tom/{ if($3==0){print "root"} else if ($3<=3){print "普通"} else{print "系统用户"}}' test

# 三目操作符
awk -F: '/tom/{ print ($3==3 ? "成功" : "失败")}' test

# for 循环
awk '/条件/{for(起始值;终止值;增长值) { if(条件) {操作} }' file
awk -F: '/tom/{ for(i=1; i<=NF; i++) {print $i}}' passwd

# 分隔符
# 分隔符::
awk -F: '{print $1}' host
# 指定多个分隔符:
awk -F[" ""\t""."","] '{print $1}' host

# BEGIN和END
BEGIN{操作} { 对文件里进行操作 } END{操作} file
awk 'BEGIN{print "------"; FS=":"} { print $2 } END{print "------"}' file
# 求总和,定义一个变量aa
awk 'BEGIN{print "------"; FS=":"; aa=0} { aa+=$3 } END{print "------" ; print aa}' file

# next 命令
# 如果遇到了next的话,那么next后面的语句就不会再执行了,用于排除指定的内容
awk '{操作1}{操作2}' passwd
awk '{next}{操作2}' passwd  # 这里操作2是不会执行的
awk '/条件1/{next} {操作2}' passwd    # 满足条件1的都直接跳过,对不满足条件1的执行操作2
# 打印没有tom的行
awk -F: '/tom/{next} {print $0}' passwd
# 打印偶数行
awk -F: 'NR%2==1{next} {print NR,$0}' passwd

# 内置变量
FS 每行的分隔符
OFS 默认输出的分隔符,默认是空格
NF 列数 每行的列数
RS 怎么定义才算是一行?默认是换行符
ORS输出结果 每行的分隔符是什么 默认是/n
FILENAME  当前执行文件名称
# 区别如下
NR 当前处理的记录号(通常是行号),单个文件和FNR相同显示行号
FNR 查看多个文件的时,序号不连续,NR是汇总累计行数,FNR是每个文件单独从1开始
[root@localhost wl]# awk '{print NR, FNR, $0}' test test1
1 1 i am good boy
2 2 1:2:3:4:5:6:7
3 1 i am good boy
4 4 1/2/3/4/5/6/7

[root@localhost wl]# awk 'NR==FNR{print FILENAME,$0}  NR!=FNR{print FILENAME,$0}' test test1
test i am good boy
test test tom
test1 i am good boy
test1 test1 tom1
test1

awk -F: '/tom/{print $1}' passwd  # 等价于下面操作
awk 'BEGIN{FS=":" ; OFS="\n"} /tom/{print $1}' passwd
数组
#访问数组的方法为 数组名[下标名] 比如a[key1]=1
echo | awk '{ a["xx"]=1; a["yy"]=2; print a["yy"] }'  # 2
echo | awk 'BEGIN{ a["xx"]=1; a["yy"]=2 } {print a["yy"]}'  # 2

# 循环数组里的元素
echo | awk '{ a["xx"]=1; a["yy"]=2; for(i in a)print a[i] }'  # 1\n2
echo | awk '{ a["xx"]=1; a["yy"]=2; for(i in a){if(i=="yy")print a[i] }}'  # 2

# 删除数组里的元素
echo | awk '{ a["xx"]=1; a["yy"]=2; delete a["xx"];for(i in a){ print a[i] }}'  # 2

【全面】python魔法函数详解

  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lance_mu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值