当前位置: 首页 > news >正文

linux三剑客

Linux三剑客~grep awk sed——Linux下一切皆文件,对Linux的操作就是对文件的处理,所以三剑客其实本质上就是Linux所有文档处理的帮助命令,认真学习将对你未来的道路打下坚实的基础。

1.grep:使用正则表达式搜索文本,并把匹配的行打印出来,是强大的文本搜索工具;

2.sed:用于编辑匹配到的文本,是一种流编辑器;

3.awk:能够对文本进行复杂的格式处理,是一种处理文本的语言。

awk

awk 它适合文本处理和报表生成,其语法较为常见,借鉴了某些语言的一些精华,如C语言等。

awk 可以进行样式装入、流控制、数学运算、流程控制,还有内置的变量和函数,具备一个完整语言所应具有的几乎所有完美特性,相当于一个小型编程语言。

awk 是以文件的一行为处理单位的,awk每接收文件的一行,就执行相应的命令。awk是逐行处理的,当awk处理一个文本时,会一行一行进行处理,处理完当前行,再处理下一行,awk默认以”换行符”为标记,识别每一行,也就是说,awk跟我们人类一样,每次遇到”回车换行”,就认为是当前行的结束,新的一行的开始,awk会按照用户指定的分割符去分割当前行,如果没有指定分割符,默认使用空格作为分隔符。

2.1基本命令格式:

awk '{pattern + action}' <file>

或者

awk [options] ‘Pattern{Action}’ file

pattern表示在数据中要查找的内容

action表示要执行的一系列命令~动作

file表示对应的文件

从字面上理解 ,action指的就是动作,awk擅长文本格式化,并且将格式化以后的文本输出,所以awk最常用的动作就是print和printf,因为awk要把格式化完成后的文本输出啊,所以,这两个动作最常用。

action:

例子:打印第1,2,3列内容

image

用指定字符来拼接

image

两种特殊模式

begin和end模式

Begin意为开始,指定了处理文本之前需要执行的操作

End意为结束,指定了处理完文本之后要执行的操作

例如:

image

image

参数(变量):

FS:输入字段分隔符, 默认为空白字符

OFS:输出字段分隔符,默认为空白字符

RS:输入记录分隔符(输入换行符), 指定输入时的换行符

ORS:输出记录分隔符(输出换行符),输出时用指定符号代替换行符

NF:number of Field,当前行的字段的个数(即当前行被分割成了几列),字段数量

NR:行号,当前处理的文本行的行号。

FNR:各文件分别计数的行号

FILENAME:当前文件名

ARGC:命令行参数的个数

ARGV:数组,保存的是命令行所给定的各参数

1.分隔符:

(字段)输入分隔符:-F。或者-v -FS=‘。’

把文档中的。。。作为分隔符

image

加上-v结果一样

image

(字段)输出分隔符:-OFS=“。。。”

把原有的分隔符用新的。。。替代显示出来

image

(行)输入分隔符:-v RS=".."

指定。。作为行之间的分隔符。不写RS则表示默认,是回车。引号内不写内容则表示空格作为行的分隔符

image

(行)输出分隔符:-v ORS=“。”

image

组合使用:把原有的a当作分隔符,替换成-。-

image

2.显示行号

行号:NR

字段数:NF

image

对多文件分别计数的行号:FNR

image

image

其他变量

filename:此处意为显示文件名

image

ARGC:命令行参数的个数

image

ARGV:数组,保存的是命令行所给定的各参数

image

上图中我们发现ARGV[?]中的?是数字,这个数字代表什么意思呢,你的命令中有第几个命令参数,比如[0]代表awk也就是最开始,[1]代表1.txt,不对啊,[1]应该是print啊,但是在awk就是这么规定的,pattern{ action }不被看作是参数,所以[1]就成了1.txt了,而因为[2]不存在,所以没输出内容

自定义变量:

方法一:-v varname=value 变量名区分字符大小写。

方法二:在program中直接定义

方法1.变量外面的引号可以是单引号也可以是双引号

image

image

方法2.变量外面的引号必须是双引号

image

image

如果我们想定义多个变量

用;号隔开即可

如果你希望变量中间没有空格,则用空格隔开,逗号“,”会被识别为分隔符

image

grep

  1. 正则表达式用于匹配对应的条件,完成文本的筛选或处理

常用的支持正则表达式的命令

grep~egrep~sed~awk~pgrep~mkdir~touch等

(egrep支持扩展正则表达式)

(pgrep是查看进程的)

使用grep

-i 大小写均可

-n 打印行号

-v 反向匹配

-w 精确匹配

image

grep: 负责从数据源中检索对应的字符串,行过滤。
grep用于根据关键字进行行过滤
grep options 'keys' filename
OPTIONS:-i: 不区分大小写-v: 查找不包含指定内容的行,反向选择-w: 按单词搜索-n: 显示行号-A: 显示匹配行及后面多少行 -A 5-B: 显示匹配行及前面多少行-o: 打印匹配关键字-c: 统计匹配到的次数-r: 逐层遍历目录查找-C: 显示匹配行前后多少行-l:只列出匹配的文件名-L:列出不匹配的文件名-e: 使用正则匹配-E:使用扩展正则匹配^key:以关键字开头key$:以关键字结尾^$:匹配空行--color=auto :可以将找到的关键词部分加上颜色的显示常用命令选项必知必会  示例:
# grep -i root passwd 忽略大小写匹配包含root的行
# grep -w ftp passwd 精确匹配ftp单词
# grep -wo ftp passwd 打印匹配到的关键字ftp
# grep -n root passwd 打印匹配到root关键字的行好
# grep -ni root passwd 忽略大小写匹配统计包含关键字root的行
# grep -nic root passwd 忽略大小写匹配统计包含关键字root的行数
# grep -i ^root passwd 忽略大小写匹配以root开头的行
# grep bash$ passwd 匹配以bash结尾的行
# grep -n ^$ passwd 匹配空行并打印行号
# grep ^# /etc/vsftpd/vsftpd.conf 匹配以#号开头的行
# grep -v ^# /etc/vsftpd/vsftpd.conf 匹配不以#号开头的行
# grep -A 5 mail passwd   匹配包含mail关键字及其后5行
# grep -B 5 mail passwd   匹配包含mail关键字及其前5行
# grep -C 5 mail passwd 匹配包含mail关键字及其前后5行

现在开始学习正则表达式

[a-z] 小写字母

[A-Z] 大写字母

[0-9] 数字

[a-zA-Z0-9] 表示所有数字和英文字符

^ 表示行开头

$ 表示行结尾

^$ 表示空行

. 代表一个字符,可以连续使用,但不能为空

* 代表一组字符,可以为空

.* 表示存在至少一个字符,可以为空

/<用来表示词首

>/用来表示词尾

扩展正则表达式

| 或者or

() 分组,改变操作符优先级

+ 匹配前面的子表达式一次或多次**
? ** 匹配前面的子表达式零次或一次

{n} 匹配前面的子表达式n次

{n,} 匹配前面的子表达式至少n次

{n,m} 匹配前面的子表达式至少n次且不超过m次

匹配筛选内容:

image

image

image

image

image

image

image

image

image

image

image

sed

是一种在线编辑器,它一次处理一行内容。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

sed [参数] [动作(内容)] 文件名

sed -i 's/要被取代的字串/新的字串/标志' test.txt

参数如下:

-n :使用安静(silent)模式。则只有经过sed 特殊处理的那一行(或者动作)才会被列出来(sed会把源文件内容和查询得到的结果同时展现出来,-n只显示查询得到的结果)。

-e :直接在命令列模式上进行 sed 的动作编辑(同时执行多个【动作】);

-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;

-r :sed 的动作支持扩展正则表达式。(默认是基础正规表示法语法)

-i :直接修改读取的文件内容,而不是输出到终端。

动作如下:

a :新增,在行后新增

c :取代

d :删除,

i :插入,在行前插入

p :列印(即显示),通常p会与参数sed -n一起运行

s:取代,通常这个 s 的动作可以搭配正规表达式例

例如:

image

image

image

image

添加:i

image

image

image

image

查询:

image

image

image

sed -i 's/要被取代的字串/新的字串/标志' test.txt

标志:

g 全局替换(替换所有匹配项)

数字 替换第 n 个匹配项(如 2 表示替换每行的第二个匹配项)

p 打印替换后的行(通常与 -n 选项配合使用)

w 将替换后的行写入文件(如 w output.txt)

i 忽略大小写(如 s/a/b/i 会匹配 A、a 等)

m 多行模式(配合 ^ 和 $ 使用,匹配跨多行的内容)

image

image

image

image

image

元字符集

^ 以什么为开始

$ 以什么为结束(最后一行)

. 代表匹配一个字符

.* 代表匹配所有

[] 配置括号内的内容[0-9][a-z][A-Z]

[^h] 不包括h的内容进行匹配

\(..\) 匹配字符串,保存匹配的字符串,其他的替换

image

image

image

image

image

常用数据处理命令(了解)

数据检索命令行检索:grep  egrep字符串检索:cut  tr数据处理命令       数据排序:sort数据去重: uniq文本数据合并: paste数据输出: tee数据处理: xargs    
cut

切割字符串,按照顺序来获取某部分内容。(相当于awk)

cut用于列截取
-c: 以字符为单位进行分割。
-d: 自定义分隔符,默认为制表符。\t
-f: 与-d一起使用,指定显示哪个区域。# cut -d: -f1 1.txt 以:冒号分割,截取第1列内容
# cut -d: -f1,6,7 1.txt 以:冒号分割,截取第1,6,7列内容
# cut -c4 1.txt 截取文件中每行第4个字符
# cut -c1-4 1.txt 截取文件中每行的1-4个字符
# cut -c5- 1.txt 从第5个字符开始截取后面所有字符

image

image

tr

从标准输入中通过替换或删除操作进行字符转换

主要用于删除文件中控制字符或进行字符转换。
使用tr时要转换两个字符串:字符串1用于查询,字符串2用于处理各种转换。语法:(可以看下面的例子)
命令1|tr  '字符串1'  '字符串2'	#把命令一的执行结果里,字符串1替换为字符串2
tr  '字符串1'  '字符串2' < filename #把文件里的字符串1替换成字符串2tr 选项 'string1' < filename #根据对应选项对字符串1进行操作-d 删除字符串1中所有输入字符。
-s 删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串。a-z 任意小写
A-Z 任意大写
0-9 任意数字# tr -d '[:/]' < 3.txt 删除文件中的:和/
# cat 3.txt |tr -d '[:/]' 删除文件中的:和/
#tr 'A' 'e' < 1.txt	将文件中A替换为e
# tr '[0-9]' '@' < 3.txt 将文件中的数字替换为@符号
# tr '[a-z]' '[A-Z]' < 3.txt 将文件中的小写字母替换成大写字母
# tr -s '[a-z]' < 3.txt 匹配小写字母并将重复的压缩为一个
# tr -s '[a-z0-9]' < 3.txt 匹配小写字母和数字并将重复的压缩为一个

image

sort

排序显示,默认排序规则是按照首字母的字符编码。

sort:将文件的每一行作为一个单位,从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。语法:
sort [options] [filename]-u :去除重复行
-r :降序排列,默认是升序
-o : 将排序结果输出到文件中  类似 重定向符号 >
-n :以数字排序,默认是按字符排序
-t :分隔符
-k :第N列,指定列来排序-b :忽略前导空格。
-R :随机排序,每次运行的结果均不同。示例:
# sort -n -t: -k3 1.txt 按照用户的uid进行升序排列
# sort -nr -t: -k3 1.txt 按照用户的uid进行降序排列
# sort -n 2.txt 按照数字排序
# sort -nu 2.txt 按照数字排序并且去重
# sort -nr 2.txt 
# sort -nru 2.txt 
# sort -nru 2.txt 
# sort -n 2.txt -o 3.txt 按照数字排序并将结果重定向到文件
# sort -R 2.txt 
# sort -u 2.txt 
uniq:

去重

uniq:去除连续重复行语法:
uniq [options] [filename]-i: 忽略大小写
-c: 统计重复行次数
-d:只显示重复行# uniq 2.txt 
# uniq -d 2.txt 
# uniq -dc 2.txt 
tee

双向输出,在屏幕上输出内容时,将内容保存到文件中

tee工具从标准输入读取并写入标准输出和文件,即:双向覆盖重定向<屏幕输出|文本输入>
somecommand |tee filename-a 双向追加重定向# echo hello world
# echo hello world|tee file1
# cat file1 
# echo 999|tee -a file1
# cat file1 
paste

将多个文件按列合并且输出,不改变源文件

paste工具用于合并文件行输出到屏幕,不会改动源文件-d:自定义间隔符,默认是tab,只接受一个字符
-s:将每个文件中的所有内容按照一行输出,文件中的行与行以TAB间隔。[root@zuolaoshi shell01]# cat a.txt 
hello
[root@zuolaoshi  shell01]# cat b.txt 
hello world
888
999
[root@zuolaoshi  shell01]# paste a.txt b.txt 
hello   hello world888999
[root@zuolaoshi  shell01]# paste b.txt a.txt   
hello world     hello
888
999[root@zuolaoshi shell01]# paste -d'@' b.txt a.txt 
hello world@hello
888@
999@[root@zuolaoshi shell01]# paste -s b.txt a.txt 
hello world     888     999
hello

xargs 上一个命令的输出作为下一个命令的命令行参数

管道(|):上一个命令的输出作为下一个命令的输入,做的是数据源。

shell字符(特殊符号):

有基础的同学不要和正则表达式中的符号含义搞混淆了。    !:                执行历史命令   !! 执行上一条命令$:                获取变量的值$(命令)			  获取命令的执行结果+ - * / %:        对应数学运算  加 减 乘 除 取余数  &:                后台执行,写在命令结尾&&				  与运算& >				  将标准输出和标准错误输出都重定向到一个文档
补充:
jobs:查看后台进程号
bg 编号:放到后台继续执行
fg 编号:放到前台继续执行
如果我们正在编写一个内容不想按wq暂时保存,可以使用ctrl+z挂起,然后想要恢复时
查看他的编号,然后放到前台继续执行即可。;:               分号可以在shell中一行执行多个命令,命令之间用分号分割    \:                转义字符``:               反引号 命令中执行命令    echo "today is `date +%F`"' ':              单引号,脚本中字符串要用单引号引起来,但是不同于双引号的是,单引号不解释变量" ":              双引号,脚本中出现的字符串可以用双引号引起来通配符    ~:                家目录    # cd ~ 代表进入用户家目录*:                星号是shell中的通配符  匹配所有?:                问号是shell中的通配符  匹配除回车以外的一个字符[list]: 匹配[list]中的任意单个字符
[!list]: 匹配除list中的任意单个字符
{string1,string2,...}: 匹配string1,string2或更多字符串重定向
>      覆盖输入 
>> 追加输入
< 输出
<< 追加输出管道命令
|:               管道符 上一个命令的输出作为下一个命令的输入   cat filename |

image


文章转载自:

http://mA78OHWb.jpdbj.cn
http://tjpxFYNP.jpdbj.cn
http://IUoTm7Z8.jpdbj.cn
http://damCwE4N.jpdbj.cn
http://Bt8JcE9v.jpdbj.cn
http://AMBBZCbD.jpdbj.cn
http://xcNThb3Z.jpdbj.cn
http://f9mXy7Q9.jpdbj.cn
http://Sxfwv3ri.jpdbj.cn
http://csZtIBuz.jpdbj.cn
http://zex3FLCl.jpdbj.cn
http://h4k0pRPQ.jpdbj.cn
http://vQtpidsQ.jpdbj.cn
http://YGEyQAph.jpdbj.cn
http://NmaG7JXE.jpdbj.cn
http://NGIv9CLu.jpdbj.cn
http://CM1UHWgO.jpdbj.cn
http://MWLfW9OL.jpdbj.cn
http://o9znT9W1.jpdbj.cn
http://eYzQHKyD.jpdbj.cn
http://iuS08DtM.jpdbj.cn
http://wtRUgLue.jpdbj.cn
http://Ypaq6Cyb.jpdbj.cn
http://5soHdL0X.jpdbj.cn
http://TFERyEPt.jpdbj.cn
http://o6sWQ3WM.jpdbj.cn
http://fLdIR040.jpdbj.cn
http://hzjbWuyZ.jpdbj.cn
http://wGXsdGjy.jpdbj.cn
http://kokiBmMv.jpdbj.cn
http://www.dtcms.com/a/375976.html

相关文章:

  • 交换排序——冒泡排序与快速排序
  • DIY项目-校遇
  • GEO 优化系统开发:技术架构与核心实现方案
  • 【66页PPT】质量管理体系五种核心工具APQP(附下载方式)
  • MySQL InnoDB Cluster介绍,MHA、PXC、InnoDB Cluster怎么选?一文讲透MySQL高可用方案最佳实践
  • Miniconda3搭建Selenium的python虚拟环境全攻略
  • 01背包,完全背包,分组背包,多重背包例题
  • Ansible之playbook
  • MapReduce :Map阶段分区后,数据怎么找到Reducer?
  • 项目研发实录:电子称SDK封装dll给到QT和C#调用
  • 短视频矩阵源码-视频剪辑+AI智能体开发接入技术分享
  • 代码随想录算法训练营第三十五天|背包问题 二维 背包问题 一维 46. 携带研究材料 416. 分割等和子集
  • FTP文件传输服务
  • 代码随想录第七天|● 454.四数相加II ● 383. 赎金信 ● 15. 三数之和 18.四数之和
  • SAP R/3系统模块结构
  • leetcode 217 存在重复元素
  • 前端 Word 模板参入特定数据 并且下载
  • LeetCode 003. 无重复字符的最长子串 - 滑动窗口与哈希表详解
  • 深度学习(五):过拟合、欠拟合与代价函数
  • 【JS】import.meta.env,process.env,window三种环境变量获取方式的区别
  • 交付只是起点:从“纸上蓝图”到“价值闭环”的保障实践,数字孪生保障落地的“三重防护网
  • LLM大模型-大模型 API 集成使用、部署本地大模型(huggingface、modelscope)、实现Qwen和Deepseek本地部署
  • Redis的入门与应用
  • pybind11错误书
  • 在 PostgreSQL中查看有哪些用户和用户权限
  • ctfshow- web入门-XXE漏洞
  • 六级第二关———坐地铁(1)
  • 实用 html 小工具
  • C#(链表创建与原地反转)
  • 光伏MPPT——拓扑结构及发波方式