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行每一列中的:替换为###