awk,sed,grep三剑客

一.grep过滤

grep --help:

匹配模式选择:

Regexp selection and interpretation:

-E, --extended-regexp     扩展正则

-F, --fixed-strings       PATTERN is a set of newline-separated fixed strings

-G, --basic-regexp       基本正则

-P, --perl-regexp         调用perl的正则

-e, --regexp=PATTERN     use PATTERN for matching

-f, --file=FILE           obtain PATTERN from FILE

-i, --ignore-case         忽略大小写

-w, --word-regexp       匹配整个单词

-x, --line-regexp         匹配正行

-z, --null-data           a data line ends in 0 byte, not newline

 

条件判断相关参数

  • 与文件存在与否的判断

-e 是否存在   不管是文件还是目录,只要存在,条件就成立

-f 是否为普通文件

-d 是否为目录

-S socket -p pipe -c character -b block -L 软link

-s 是否为空白文件   说明:-s表示非空,! -s 表示空文件

  • 文件权限相关的判断

-r 当前用户对其是否可读

-w 当前用户对其是否可写

-x 当前用户对其是否可执行

-u 是否有suid -g 是否sgid

-k 是否有t位

  • 两个文件的比较判断

file1 -nt file2 比较file1是否比file2新

file1 -ot file2 比较file1是否比file2旧

file1 -ef file2 比较是否为同一个文件,或者用于判断硬连接,是否指向同一个inode

  • 整数之间的判断

-eq 相等

-ne 不等

-gt 大于

-lt 小于

-ge 大于等于

-le 小于等于

  • 字符串之间的判断

-z 是否为空字符串   字符串长度为0,就成立

-n 是否为非空字符串   只要字符串非空,就是成立

string1 = string2 是否相等

string1 != string2 不等 ! 结果取反

  • 多重条件判断

逻辑判断符号:

-a     和 && (and 逻辑与)

-o     和 ||(or 逻辑或) !   逻辑非

总结:

1、; && ||都可以用来分割命令

2、; 完全不考虑前面的语句是否正确执行,都会执行;号后面的内容

3、&& 需要考虑&&前面的语句的正确性,前面语句正确执行才会执行&&后的内容;反之亦然

4、|| 需要考虑||前面的语句的非正确性,前面语句执行错误才会执行||后的内容;反之亦然

5、如果&&和||一起出现,从左往右依次看,按照以上原则,此时么有优先级

6、优先级是在多重条件判断中,如[ 1 -eq 1 -o 1 -ne 1 -a 2 -eq 3 ]

 

二、sed 介绍

1. sed的工作流程

  • 首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间),然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。
  • sed每处理完一行就将其从临时缓冲区删除,然后读取下一行,进行处理和显示。处理完输入文件的最后一行后,sed便结束运行。
  • sed把每一行都存在临时缓冲区中,对这个副本进行编辑,所以不会修改原文件。
  • Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

2. sed两种使用方法

sed常见的语法格式有两种,一种叫命令行模式,另一种叫脚本模式。

2.1 命令行格式

  • 格式

sed -option 'commands[地址定位]' filename

说明:引用shell script中的变量应使用双引号,而非通常使用的单引号

option:

-e 进行多项编辑,即对输入行应用多条sed命令时使用

-n 取消默认的输出 -f 指定sed脚本的文件名

-r 使用扩展正则表达式

-i 重定向输出<修改源文件>

  • 常用命令

p 打印行

d 删除行 ​

i\ 在当前行之前插入文本。多行时除最后一行外,每行末尾需用"\"续行

a\ 在当前行后添加一行或多行。多行时除最后一行外,每行末尾需用“\”续行

c\ 用此符号后的新文本替换当前行中的文本。多行时除最后一行外,每行末尾需用"\"续行

sed '5aitcast.cc hello' 1.txt

sed 'a8888888' 1.txt

sed 'i8888888' 1.txt

sed '$i8888888' 1.txt //最后一行的前面插入

sed '$a8888888' 1.txt 最后一行的后面插入

# sed '7chello\nworld' 1.txt //替换第7行的所有内容 ​

r 从文件中读取输入行

w 将所选的行写入文件

sed '10r/etc/hosts' 1.txt

 sed '$r/etc/hosts' 1.txt

 sed '1,5w 2.txt' 1.txt

 cat 2.txt

 sed '1,5w /tmp/1.txt' 1.txt

 cat /tmp/1.txt

! 对所选行以外的所有行应用命令,放到行数之后 #

sed -n '1!p' 1.txt

s 用一个字符串替换另一个

g 在行内进行全局替换

[root@server shell04]# sed -n 's/root/ROOT/p' 1.txt ROOT:x:0:0:root:/root:/bin/bash

[root@server shell04]# sed -n 's/root/ROOT/gp' 1.txt ROOT:x:0:0:ROOT:/ROOT:/bin/bash

y 将字符替换为另一字符(不能对正则表达式使用y命令)

&   保存查找串以便在替换串中引用

=   打印行号

 

  • 定址

定址用于决定对哪些行进行编辑。地址的形式可以是数字、正则表达式、或二者的结合。如果没有指定地址,sed将处理输入文件的所有行。

x   指定x行号

x,y 指定x到y行号

/key/ 查询包含关键字的行

/key1/,/key2/   匹配包含两个关键字之间的行

/key/,x 从匹配关键字的行开始到文件第x行之间的行(包含关键字所在行)

x,/key/ 从第x行开始到与关键字的匹配行之间的行

x,y! 不包含x到y行

 

y命令 该命令与UNIX/Linux中的tr命令类似,字符按照一对一的方式从左到右进行转换。

正则表达式元字符对y命令不起作用。与s命令的分隔符一样,斜线可以被替换成其它的字符。

# sed '39,41y/stu/STU/' /etc/passwd

# sed '39,41y/stu:x/STU@%/' /etc/passwd ​

-e 选项 多项编辑

-e是编辑命令,用于sed执行多个编辑任务的情况下。在下一行开始编辑前,所有的编辑动作将应用到模式缓冲区中的行上。 ​

-i 选项 直接修改原文件

# sed -i 's/root/ROOT/;s/stu/STU/' 11.txt ​

& 符号 保留查找字符串

# sed -n 's/^root/#&/p' passwd  

注释掉以root开头的行

# sed -n -r 's/^root|^stu/#&/p' /etc/passwd

注释掉以root开头或者以stu开头的行

# sed -n '1,5s/^[a-z].*/#&/p' passwd

注释掉1~5行中以任意小写字母开头的行

# sed -n '1,5s/^/#/p' /etc/passwd

注释1~5行 或者

sed -n '1,5s/^/#/p' passwd

以空开头的加上

# sed -n '1,5s/^#//p' passwd

以#开头的替换成空 vim ——>ctrl+v——>I(行头插入)——>ESC

 sed -n '/^root/p' 1.txt

 sed -n 's/^root/#&/p' 1.txt

 sed -n 's/\(^root\)/#\1/p' 1.txt

 sed -nr '/^root|^stu/p' 1.txt

 sed -nr 's/^root|^stu/#&/p' 1.txt

= 打印行号

# sed -n '/bash$/=' passwd   打印以bash结尾的行的行号 ​

# sed -ne '/root/=' -ne '/root/p' passwd

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin ​

# sed -n '/nologin$/=;/nologin$/p' 1.txt

# sed -ne '/nologin$/=' -ne '/nologin$/p' 1.txt

2.2脚本格式

  • 用法

# sed -f scripts.sed file //使用脚本处理文件 建议使用   ./sed.sh

脚本的第一行写上 #!/bin/sed -f

 

1) 脚本文件是一个sed的命令行清单。

2) 在每行的末尾不能有任何空格、制表符(tab)或其它文本。

3) 如果在一行中有多个命令,应该用分号分隔。

4) 不需要且不可用引号保护命令

5) #号开头的行为注释

 

 

 

2.3 sed和正则的综合运用

1、正则表达式必须以”/“前后规范间隔

例如:

sed '/root/d' file

例如:sed '/^root/d' file

​ 2、如果匹配的是扩展正则表达式,需要使用-r选来扩展sed

注意:        

在正则表达式中如果出现特殊字符(^$.*/[]),需要以前导 "\" 号做转义

eg:sed '/\$foo/p' file ​

3、逗号分隔符 例如:sed '5,7d' file 删除5到7行

例如:sed '/root/,/ftp/d' file 删除第一个匹配字符串"root"到第一个匹配字符串"ftp"的所有行本行不找 循环执行      

4、组合方式 例如:sed '1,/foo/d' file 删除第一行到第一个匹配字符串"foo"的所有行

例如:sed '/foo/,+4d' file 删除从匹配字符串”foo“开始到其后四行为止的行

例如:sed '/foo/,~3d' file 删除从匹配字符串”foo“开始删除到3的倍数行(文件中)

例如:sed '1~5d' file 从第一行开始删每五行删除一行

例如:sed -n '/foo|bar/p' file 显示配置字符串"foo"或"bar"的行

例如:sed -n '/foo/,/bar/p' file 显示匹配从foo到bar的行

例如:sed '1~2d' file 删除奇数行

例如:sed '0-2d'   file 删除偶数行 sed '1~2!d' file ​ 5、特殊情况

例如:sed '$d' file 删除最后一行

例如:sed '1d' file 删除第一行

6、其他: sed 's/.//' a.txt 删除每一行中的第一个字符

sed 's/.//2' a.txt 删除每一行中的第二个字符

sed 's/.//N' a.txt 从文件中第N行开始,删除每行中第N个字符(N>2)

sed 's/.$//' a.txt 删除每一行中的最后一个字符

 

将test.txt 中所有的回车替换成空格

sed -i “:a;N;s/\r/\n/g” test.txt

 

三、awk

 

  • awk是一种编程语言,主要用于在linux/unix下对文本和数据进行处理,是linux/unix下的一个工具。数据可以来自标准输入、一个或多个文件,或其它命令的输出。
  • awk的处理文本和数据的方式:逐行扫描文件,默认从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。
  • awk分别代表其作者姓氏的第一个字母。因为它的作者是三个人,分别是Alfred Aho、Brian Kernighan、Peter Weinberger。
  • gawk是awk的GNU版本,它提供了Bell实验室和GNU的一些扩展。
  • 下面介绍的awk是以GNU的gawk为例的,在linux系统中已把awk链接到gawk,所以下面全部以awk进行介绍。

 

1. awk两种使用方法

  • 命令模式

awk [options] 'commands' file(s)

option 部分

-F 定义字段分割符号

-v 定义变量并赋值 command 部分:

1、范围说明或者正则表达式或者{awk命令语句1;awk命令语句2;}

2、范围说明部分可以是BEGIN、END、逻辑表达式或者为空

3、awk命令语句间用分号间隔

4、引用shell变量需用双引号引起

 

  • 脚本模式

awk [options] -f scriptfile file(s) 特点:

1、awk脚本是awk命令的清单

2、命令需要用分号间隔

3、#号开头的是注释行

4、#!/bin/awk -f

2. awk基本应用(commands)

  • 字段分割及相关变量

$1,$2,$3...$n:awk中用该顺序形式表示files中每行以间隔符号分割的各列的不同字段

$0表示文本本身 注: awk默认以空格符为间隔符号将每行分割为单独的字段,也可以使用awk内置变量FS定义间隔符号

NF 表示当前记录的字段数(列数)

$NF 最后一列

$(NF-1) 倒数第二列

FNR/NR 行号

FILENAME 文件名

"\t" 制表符

"\n" 换行符

RS 换行符

"" 打印字符串

FS 定义间隔符

print 打印函数 ​

 

  • 定义变量

# awk -v NUM=3 -F: '{ print $NUM }' /etc/passwd 注意: awk中调用变量不需要加$

定址

关键字:

BEGIN:表示在程序开始前执行

END :表示所有文件处理完后执行

BEGIN和END之间";"分号隔开 ​

示例:

1. 打印最后一列和倒数第二列(登录shell和家目录)

# awk 'BEGIN {FS=":"} {print $NF, $(NF-1)}' /etc/passwd|head -5

# awk 'BEGIN{FS=":"};{print $NF"@@@@"$(NF-1)}' 1.txt

 

 

 

3. awk和正则的综合运用

  • 逻辑运算符

== (等于)

!= (不等于)

> (大于)

< (小于)

>= (大于等于)

<= (小于等于)

~ (匹配于)

!~ (不匹配于)

! (非)

&& (与)

|| (或)

 

 

 

 

  • 示例

# awk '/root/{print $1}' passwd     使用普通字符定位

# awk '$0 ~ /^root/ {print $1}' passwd 使用正则表达式定位 ​

注意:正则需要用"/xx/"包住 ​

从第一行开始匹配到以lp开头行

awk -F: 'NR==1,/^lp/{print $0 }' passwd

从第一行到第5行        

awk -F: 'NR==1,NR==5{print $0 }' passwd

从以lp开头的行匹配到第10行      

awk -F: '/^lp/,NR==10 {print $0 }' passwd

从以root开头的行匹配到以lp开头的行    

  awk -F: '/^root/,/^lp/{print $0}' passwd

打印以root开头或者以lp开头的行          

awk -F: '/^root/ || /^lp/{print $0}' passwd awk -F: '/^root/;/^lp/{print $0}' passwd

显示5-10行  

awk -F':' 'NR>=5 && NR<=10 {print $0}' /etc/passwd    

awk -F: 'NR<10 && NR>5 {print $0}' passwd ​

打印IP地址

# ifconfig eth0|awk 'NR>1 {print $2}'|awk -F':' 'NR<2 {print $2}'  

# ifconfig eth0|grep Bcast|awk -F':' '{print $2}'|awk '{print $1}'

# ifconfig eth0|grep Bcast|awk '{print $2}'|awk -F: '{print $2}'

# ifconfig eth0|awk NR==2|awk -F '[ :]+' '{print $4RS$6RS$8}'

# ifconfig eth0|awk "-F[ :]+" '/inet addr:/{print $4}'

 

 

 

screen 小工具

screen ctrl a+d 把前台进车个放入后台运行

screen -ls 查询 被放入后台的进程

screen -dmS 进程名 命令 直接 进入后台运行

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值