把简单的技术学到极致就是高手。

前言

Linux三剑客指的是grep、sed以及awk命令的使用,这三个命令功能异常强大,大到没朋友。grep命令主打“查找”,sed命令主打“编辑”,awk命令主打“分割处理”。之所以是28分钟,大概是我比较严谨吧,数字也比较吉利。

下面给和网管相关的几个例子看看实用的效果,改进建议也经常会用这些命令写自动化脚本。如果以下例子秒懂,那不用看了,该干嘛干嘛。

1、扫描本地ip地址

ifconfig eth0 | grep "inet addr:" | awk '{print $2}' | sed 's/addr://g'

2、扫描端口号被哪个进程占用

netstat -anp | awk '{print $4,$7}' | grep 31006 | sed -n '1p' | awk '{print $2}' | awk -F'/' '{print $1}' | xargs ps -lfp | sed -n '2p' | awk '{print $17}'

3、获取某个进程的堆栈

ps -elf | grep -v grep | grep necomm_agent | awk '{print $4}' | xargs gstack > yp.txt

4、批量重命名网元license备份的文件名

for i in `ls`; do mv -f $i `echo $i | sed 's/^[a-zA-Z0-9].*_[a-zA-Z0-9].*_\([0-9]\{8\}\)\(_\)\([0-9]\{6\}\)\(\.txt\)$/Lic_Esn_\1\2\3/'`; done

5、统计某个文件夹下的文件占用的字节数

ls -l | awk 'BEGIN {size=0;} {size = size + $5;} END{print “[end]size is ”, size/1024,1024, “M”}'

里面有几个知识点先行赘述。

1、  何时需要xargs?

1)  有些命令本身是不支持管道,这个时候要加xargs,本身支持管道的命令有限如

cut grep sort uniq wc tee join split等

如下面的例子

echo “/opt” | ls –l       //ls本身是不支持管道,所以对于前面管道输出的内容会忽略,不会输出/opt目录下内容

echo “/opt” | xargs ls –l   //加上xargs,执行的结果就是输出/opt下目录的内容

2)  命令虽然支持管道,但如果不加xargs和加xargs意义也截然不同。

比如网管中经常用到到在某个目录下查找某个abc字符串:

find ./ | grep “abc” //这个命令不会在目录下文件查找,而是把find出来的内容中查找,相当于在一群文件名中查找是否有包含abc的文件名。

find ./ | xargs grep “abc” //这个命令是把find出来的东西当做参数传递给管道后的内容,相当于在find出来的文件内容中查找是否包含字符串abc。

2、  正则表达式

一个正则表达式通常被称为一个模式,用来描述或匹配一系列符合某个语法规则的字符串。正则表达式有多重不同的风格,但大同小异,下面列出PCRE中常用的元字符和意义。POSIX正则表达式分为基本正则表达式(BRE)和扩展表达式(ERE)。

目前很多UNIX工具程序沿用某一种正则表达式形式来强化本身的功能。常用的包括

1)  grep工具组:grep和egrep

2)  改变输入流的sed流编辑器

3)  字符串处理程序语言:awk

4)  文件查询程序:more、less

5)  文本编辑器:vi

字符

意义

支持的类型

\

将下一个字符标记为特殊字符,或者将一个元字符转义为普通字符。如n加上\匹配一个换行符。\\则匹配一个\字符。

BOTH

^

匹配输入字符串的开始位置

BOTH

$

匹配输入字符串的结束位置

BOTH

*

匹配前面的子表达式0次或者多次,如zo*能匹配z和zoo

BOTH

匹配前面的子表达式0次或者1次

ERE

.

匹配除\n之外的任何单个字符

BOTH

+

匹配前面的子表达式1次或者多次,如zo+能匹配zo和zoo,但不能匹配z

ERE

|

匹配于|符号前或后的正则表达式

ERE

{n,m}

最少匹配n次,最多匹配m次和BRE的区别是不需要加\

ERE

\{n\}

匹配前面的子表达式n次

BRE

\{n,\}

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

BRE

\{n,m\}

最少匹配n次,最多匹配m次

BRE

\(\)

将\(与\)间的模式存储在特殊的保留空间

BRE

\digit

重复在\(与\)方括号内第n个子模式至此点的模式

BRE

[xyz]

匹配xyz中的任何一个字符

BOTH

[^xyz]

匹配未包含的任意字符

BOTH

[x-z]

匹配小写的字符

BOTH

如:

grep ‘a\{3\}’ test.txt  \\查找test.txt中包含3个a的行

grep ‘^aa’ test.txt    \\查找test.txt中以aa开头的行

grep ‘^$’ test.txt     \\查找所有空行

后向引用

后向引用指的是“匹配于正则表达式匹配的先前的部分”。后向引用只在BRE中存在。使用后向引用的步骤有两步。

1、  将子表达式包围在\(与\)里,单个模式里可包含最多9个子表达式

2、  在模式之后使用\digit,digit是介于1至9的数字,指的是“匹配于第n个先前方括号内子表达式匹配成功的字符”

grep ‘\(why\).*\1’ test.txt           \\一行里可以匹配why..why

grep ‘\(ab\)\(cd\)[def]*\2\1’ test.txt   \\匹配abcddcdab

\< \>

匹配单词的开头与结尾。单词是由字母、数字及下划线组成。

 

以下图为各种UNIX程序与其使用的正则表达式

类型

Grep

sed

vi

more

egrep

awk

BRE

ERE

\< \>

好,进入正题。

一、 grep命令

grep是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来,其格式如下:

grep [选项] pattern file

常用的选项

-v 过滤指定字符串内容的行

-i  不区分大小写

-n  顺便打印出行号

-c  计算出符合行的次数

-E 默认grep只支持基本的正则表达式,加上-E支持扩展的正则表达式,grep –E和egrep意义一样,扩展的正则表达式有’+’,’?’,’|’,’()’

常用的命令

ps –elf | grep –v grep | grep “necomm_agent” //如果不加grep –v grep,输出2条内容

grep –i ‘abc’ test.txt//忽略大小写,找出test.txt包含abc的行

grep –v ‘^$’ test.txt > testnew.txt //过滤test.txt的空行

二、 sed命令

sed是操作、过滤和转换文本内容的强大工具,常用功能增删改查,过滤,取行。

格式如下:

sed [options] [sed-commands] [input-file]

sed [选项] [sed命令] [输入文件]

说明:

options常用的有:

-n :抑制默认输出

-e 执行多条编辑命令

-i:直接在原文件中修改

sed-commands既可以是单个sed命令,也可以是多个sed命令组合

input-file(输入文件)是可选项,sed还能够从标准输入如管道获取输入

工作原理

sed是从文件或管道中读取一行,放在模式空间中,进行处理,处理完输出一行;再读取一行,再处理一行

模式空间:sed内部的一个临时缓存,用于存放读取到的内容

1

a 追加文本到指定行后

i 插入文本到指定行前

i 单行增加

sed '2a abc' test.txt

sed '2i abc' test.txt

ii 增加多行

sed '2a abc\

cde' test.txt

指定执行的地址范围

sed可以对单行或多行进行处理,如果在sed命令前面不指定地址范围,那么默认会匹配所有行。

用法 n1[,n2] {sed-commands}

地址用逗号分隔的,n1,n2可以是数字、正则表达式、或两者的组合表示。$表示最后一行。

/abc/,/fff/{sed-commands} //对匹配abc的行到匹配fff的行操作

2)删

d 删除指定的行

sed '/aaa/d' test.txt

3)

i c用新行取代旧行

sed '2c abc' test.txt

ii  文本替换

sed 's/abc/bcd/g' test.txt //后面的g代表全局替换,如果不加g,只替换每行第一个匹配的字符串

sed ‘s/^/abc /’ test.txt //在test.txt每行前插入abc

sed -i '/aaa/s/abc/bcd/g' test.txt //加上-i代表修改了文件test.txt

替换部分有几个特殊的元字符,它们分别是

&:被pattern匹配的内容

\num:被pattern匹配的第num个分组(正则表达式的概念,\(…\)括起来的部分成为分组)

sed '/d/s/ab/&jj/' test.txt //将匹配d内容的行中的ab替换为abjj

echo this is digit 7 in a number | sed 's/digit \([0-9]\)/\1/' //将命令中的digit 7 修改为7

4)

p 输出指定内容,但默认会输出2次匹配的结果,因此使用n取消默认输出

按行查询

sed -n '2p' test.txt

按字符串查询

sed –n ‘/abc/p’ test.txt

混合查询

sed –n ‘2,/abc/p’ test.txt

5多命令编辑

sed -e '1,5d' -e 's/test/check/' test.txt

三、awk命令

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生产报告时,显得尤为强大。简单的说就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

使用方法

awk [-F field-separator] '{pattern + action}' {filename}

pattern表示awk在数据库中查找的内容,action表示找到匹配内容所执行的一系列命令,pattern就是要表示的正则表达式,用斜杠括起来。

-F 域分隔符 是可选的,如果不指定,默认的域分隔符是空格

awk '{print $1}'

cat /etc/passwd |awk  -F ':'  'BEGIN {print "name,shell"}  {print $1","$7} END {print "blue,/bin/nosh"}'

执行流程为:先执行BEGIN,然后读取文件,读入有\n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0表示所有域,$1表示第一个域,$n表示第n个域,随后开始执行模式所对应的动作action。

然后开始读入第二条记录.....直到所有的记录都读完,最后执行END操作

常用的命令

awk -F: '/^root/' /etc/passwd 如果没有指定action,默认输出每行的内容

awk -F: '/^ftp/{print $4}' /etc/passwd 指定了action

ls -l|awk '/^[^d]/ {print $9"\t"$5} {tot+=$5} END{print "totKB:" tot}'

统计某个文件夹下的文件占用的字节数

ls -l | awk 'BEGIN {size=0;} {size = size + $5;} END{print “[end]size is ”, size/1024,1024, “M”}'

awk的编程是从C语言借鉴过来的,所以语法类似

如test.txt中包含姓名和各科成绩,输出姓名和最大成绩

awk 'BEGIN {MAX=0;} {NAME = $1; for(x=2; x<=NF; x++) { if($x >= MAX) { MAX=$x}} printf "name:%s  MAX:%d\n", NAME,MAX; MAX=0}' test.txt

28分钟学会Linux三剑客的更多相关文章

  1. 10分钟学会Linux

    10分钟学会Linux有点夸张,可是能够让一个新手初步熟悉Linux中最重要最主要的知识,本文翻译的英文网页在众多Linux入门学习的资料中还是很不错的. 英文地址:http://freeengine ...

  2. 一篇文章带你学会Linux三剑客之一:awk

    awk是一种用于处理文本.模式匹配的编程语言.与sed和grep,俗称Linux下的三剑客.学会 awk 等于你在 Linux 命令行里,又多了一种处理文本的选择.这篇文章重点教你如何使用,看完这篇文 ...

  3. 10 分钟学会Linux常用 bash命令

    目录 基本操作 1.1. 文件操作 1.2. 文本操作 1.3. 目录操作 1.4. SSH, 系统信息 & 网络操作 基本 Shell 编程 2.1. 变量 2.2. 字符串替换 2.3. ...

  4. 10分钟学会 linux awk命令

    简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...

  5. 10分钟 教你学会Linux/Unix下的vi文本编辑器

    10分钟 教你学会Linux/Unix下的vi文本编辑器 vi编辑器是Unix/Linux系统管理员必须学会使用的编辑器.看了不少关于vi的资料,终于得到这个总结.不敢独享,和你们共享. 首先,记住v ...

  6. Linux实战教学笔记12:linux三剑客之sed命令精讲

    第十二节 linux三剑客之sed命令精讲 标签(空格分隔): Linux实战教学笔记-陈思齐 ---更多资料点我查看 1,前言 我们都知道,在Linux中一切皆文件,比如配置文件,日志文件,启动文件 ...

  7. Linux实战教学笔记18:linux三剑客之awk精讲

    Linux三剑客之awk精讲(基础与进阶) 标签(空格分隔): Linux实战教学笔记-陈思齐 快捷跳转目录: * 第1章:awk基础入门 * 1.1:awk简介 * 1.2:学完awk你可以掌握: ...

  8. [分享] 史上最简单的封装教程,五分钟学会封装系统(以封装Windows 7为例)

    [分享] 史上最简单的封装教程,五分钟学会封装系统(以封装Windows 7为例) 踏雁寻花 发表于 2015-8-23 23:31:28 https://www.itsk.com/thread-35 ...

  9. 50分钟学会Laravel 50个小技巧

    50分钟学会Laravel 50个小技巧 时间 2015-12-09 17:13:45  Yuansir-web菜鸟 原文  http://www.yuansir-web.com/2015/12/09 ...

  10. 【译】10分钟学会Pandas

    十分钟学会Pandas 这是关于Pandas的简短介绍主要面向新用户.你可以参考Cookbook了解更复杂的使用方法 习惯上,我们这样导入: In [1]: import pandas as pd I ...

随机推荐

  1. Vmware虚拟主机访问外网设置

    本手册使用10.4.7.0/24网段 重点在于虚拟主机的网关和宿主机上的Vmnet8的IP和虚拟网络编辑器的NET网关保持一致 1.设置宿主机网络适配器 选择允许Vmware网络共享 配置VMnet8 ...

  2. Typora自动上传超级详细教程!!

    第一步检查环境变量 打开cmd 查看以下环境变量 需要软件: Typora PicGo gitee账号 配置node 配置git 第二步创建gitee仓库 设置仓库名直接创建,因为这里不能直接修改开源 ...

  3. 国产PLM软件在创新实践中强势崛起

    近日,"璞华PLM"先后获得微度医疗.埃特斯等多个客户的订单,即使在疫情环境下也展现出了强劲的高速增长.在产品生命周期管理(PLM,Product Lifecycle Manage ...

  4. 一文了解 Java 中的构造器

    摘要:Java 也采用了构造器,并且还提供了一个垃圾收集器(garbage collector),当不再使用内存资源的时候,垃圾收集器会自动将其释放. 本文分享自华为云社区<一文带你了解 Jav ...

  5. 关于mciSendString函数调用mp3音频的问题

    先说结论:这个函数一定要调用MP3文件,手动改MP3格式无效,一定要保证下载源是MP3格式文件.具体可参考:https://blog.csdn.net/m0_46436640/article/deta ...

  6. nginx+uwsgi+flask

    说明:没用虚拟环境 安装nginx,并新建一个conf配置文件,启动nginx # xxx.conf server { listen 80; server_name localhost; locati ...

  7. Kibana插件

    附加的功能在 Kibana 中是以插件的形式提供的.您可以利用 bin/kibana-plugin 命令来管理这些模块.您也可以手动安装这些插件,只需要将这些插件包放到 plugins 目录并解压到新 ...

  8. 示例:Ingress通过互联网访问应用

    Ingress Ingress 是 Kubernetes 的一种 API 对象,将集群内部的 Service 通过 HTTP/HTTPS 方式暴露到集群外部,并通过规则定义 HTTP/HTTPS 的路 ...

  9. Prometheus告警处理

    在Prometheus Server中定义告警规则以及产生告警,Alertmanager组件则用于处理这些由Prometheus产生的告警.Alertmanager即Prometheus体系中告警的统 ...

  10. 各编程语言 + aardio 相互调用示例

    代码简单.复制可用.aardio 快速调用 C,C++,C#,Java,R,V,Python,JavaScript,Node.js,Rust,PHP,Ruby,PowerShell,Fortran,D ...