Linux中GREP,SED,AWK的用法

1.grep

grep命令是一个Linux文本处理工具,它与egrep命令属于同一系列,这些命令都是用于对文件和文本执行重复搜索任务的工具。我们可以通过grep命令指定特定搜索条件来搜索文件及其内容以获取有用的信息。grep是全局搜索正则表达式并打印出匹配的行,其抓取数据是贪婪模式,即不会漏掉过滤内容,但准确性会相对降低。

示例数据文件

请将以下数据剪切粘贴到一个名为 “sampler.log” 的文件中:

boot
book
booze
machine
boots
bungie
bark
aardvark
broken$tuff
robots

简单示例

grep 最简单的例子:

在本例中,grep 将遍历文件 “sampler.log” 的每一行,并打印出其中的每一行 包含单词“boo”:

boot
book
booze
boots

但是如果你操作的是大型文件,就会出现这种情况:如果这些行标识了文件中的哪一行,它们是什么,可能对你更有用,如果需要在编辑器中打开文件,那么可以更容易地跟踪特定字符串做一些改变。 这时候可以通过添加 -n 参数来实现: 

grep -n "boo" sampler.log

这产生了一个更有用的结果,解释了哪些行与搜索字符串匹配:

1:boot
2:book
3:booze
5:boots 

另一个有趣的参数是 -v,它会打印出相反的结果。换句话说,grep 将打印所有与搜索字符串不匹配的行,而不是打印与之匹配的行。

在下列情况下,grep 将打印不包含字符串 “boo” 的每一行,并显示行号,如上一个例子所示

grep -vn "boo" sampler.log 
4:machine
6:bungie
7:bark
8:aardvark
9:broken$tuff
10:robots

c 选项告诉 grep 抑制匹配行的打印,只显示匹配行的数量,匹配查询的行。

例如,下面将打印数字4,因为有4个在 sampler.log 中出现 “boo”。

c 选项告诉 grep 抑制匹配行的打印,只显示匹配行的数量,匹配查询的行。

例如,下面将打印数字4,因为有4个在 sampler.log 中出现 “boo”。

l 选项只打印查询中具有与搜索匹配行的文件的文件名字符串。 如果你想在多个文件中搜索相同的字符串,这将非常有用。像这样:  

grep -l "boo" * 

对于搜索非代码文件,一个更有用的选项是 -i,忽略大小写。这个选项将处理在匹配搜索字符串时,大小写相等。 在下面的例子中,即使搜索字符串是大写的,包含“boo”的行也会被打印出来。

grep -i "BOO" sampler.log 
boot
book
booze
boots 

 x 选项只精确匹配。换句话说,以下命令搜索没有结果,因为没有一行只包含"boo"

grep -x "boo" sampler.log 

最后,-A 允许你指定额外的上下文件行,这样就得到了搜索字符串额外行,例如 

grep -A2 "mach" sampler.log
machine
boots
bungie 

2.AWK 

AWK是一种处理文本文件的语言。它将文件作为记录序列处理。在一般情况下,文件内容的每行都是一个记录。每行内容都会被分割成一系列的域,因此,我们可以认为一行的第一个词为第一个域,第二个词为第二个,以此类推。AWK程序是由一些处理特定模式的语句块构成的。AWK一次可以读取一个输入行。对每个输入行,AWK解释器会判断它是否符合程序中出现的各个模式,并执行符合的模式所对应的动作。

命令基本格式:

awk [optioins] {program} file
简化命令    选项    描述
-F    fs    指定行中划分数据字段的字段分隔符 「* 超高频」
-f    file    从指定的文件中读取程序
-v    var=value    定义awk程序中的一个变量及其默认值
-mf    N    指定要处理的数据文件中的最大字段数
-mr    N    指定数据文件中的最大数据行数
-W    keyword    指定awk的兼容模式或者警告登记

$0 :代表整个文本行

$1:代表文本行中的第一个数据字段(第一列)

$2:代表文本行中的第二个数据字段(第二列)

$n:代表文本行中的第二个数据字段(第n列)

模式匹配和控制语句 

AWK 是一种面向行的语言。首先是模式,然后是动作。 操作语句用{ and }括起来。模式可能缺失,或者动作可能缺失,但是,当然不是都。 如果缺少模式,则对每个输入记录执行操作。一个丢失的动作将打印整个记录。

AWK 模式包括正则表达式(使用与“grep -E”相同的语法)和使用的组合特殊符号 “&&” 表示“逻辑AND ”,“||”表示“逻辑或”,“!” 的意思是“逻辑不”。 你也可以做关系模式、模式组、范围等。

if (condition) statement [ else statement ]
while (condition) statement
do statement while (condition)
for (expr1; expr2; expr3) statement
for (var in array) statement
break
continue
exit [ expression ] 

命令行和用法 

你可以根据需要多次使用 ' -v ' 标志将变量传递给 awk 程序,例如

awk -v skip=3 '{for (i=1;i<skip;i++) {getline}; print $0}' sampler.log 
booze
bungie
broken$tuff

你还可以使用编辑器编写 awk 程序,然后将其另存为脚本文件,例如: 

$ cat awk_strip
#!/usr/bin/awk -f
#only print out every 3rd line of input file
BEGIN {skip=3}
{for (i=1;i<skip;i++)
 {getline};
print $0} 

然后可以将其用作新的附加命令 

chmod u+x awk_strip
./awk_strip sampler.dat 

3.sed 

sed 全名叫 stream editor即流编辑器,与 vim 的交互式编辑方式截然不同,作为一种非交互式编辑器,sed使用预先设定好的编辑指令对输入的文本进行编辑,完成之后输出编辑结果。其功能十分强大,加上正则表达式的支持,可以进行大量的复杂文本的编辑操作。

命令格式 

p :显示

sed 参数 命令 处理对象
sed -n 5p westos         ##显示第5行
sed -n 3,5p westos         ##显示第3行到第5行
sed -n "3p;5p" westos     ##显示第3行和第5行
sed -n 1,5p westos     ##显示1-5行
sed -n '5,$p' westos     ##显示第5行到最后一行
sed -n '/^#/p' fstab     ##显示以#开头的行

d :删除 

sed 5d westos             ##删除第5行
sed '/^#/d' fstab         ##把以#开头的行删除
sed '/^UUID/!d' fstab     ##删除不是以UUID开头的所有行
sed  '5,$d' westos        ##删除第5行到最后一行 

a :添加 

sed '$a hello world' fstab        ##在最后一行后添加字符串
sed '$a hello\nworld' fstab        ##在最后一行后添加字符串,使用换行符隔开
sed '/^#/a hello world' fstab    ##在以#开头的行后添加字符串 

c :替换 

sed '/^#/c hello world' fstab    ##将所有以#开头的行替换为指定字符串
sed '5chello world' westos        ##将第5行替换为指定字符串 

w :把符合的行写入到指定文件中
sed '/^UUID/w westofile' westos :把westos中UUID开头的行写入westosfile中 

i :插入
sed '5ihello westos' westos:在westos文件的第5行前插入指定字符串 

r :整合文件
sed '5r westofile' westos:将westofile文件中的内容整合到westos文件的第5行后 

e: 多点编辑

sed -e 's/input/output/' sampler.log 
boot
book
booze
machine
boots
bungie
bark
aardvark
broken$tuff
robots

将从 sampler.log 回显到标准输出的每一行,改变每一行的 'input' 排成 'output'。 注意 sed 是面向行的,所以如果你想改变每一行的每一个事件,那么你需要让它成为一个 '贪婪' 的搜索和替换,如下所示:

sed -e 's/input/output/g' sampler.log 
boot
book
booze
machine
boots
bungie
bark
aardvark
broken$tuff
robots 

/.../ 中的表达式可以是文字字符串或正则表达式。 注意默认情况下,输出将写入 stdout。 你可以将其重定向到新文件,或者如果你愿意 编辑现有文件,你应该使用 '-i' 标志: 

sed -e 's/input/output/' sampler.log  > new_file
sed -i -e 's/input/output/' sampler.log   

命令实例

1.假设selinux为关闭状态,编写脚本Apache_port.sh修改http端口号
思路:首先对执行脚本时脚本后用户输入的字符串进行是否为空的判断,如果为空则退出运行并提示用户输入端口号,如果不为空则对用户输入的端口号使用lsof -i:命令检测该端口是否被占用,如果被占用则退出运行并报错,如果未被占用则使用sed命令将httpd服务主配置文件/etc/httpd/conf/httpd.conf中的端口设定语句替换为用户输入端口号对应的端口设定语句,接着重启httpd服务
  2.使用sed命令将westos文件中第1行和第4行每一列中的:替换为###

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值