Grep、Sed、Awk 03 Awk

Grep、Sed、Awk 03 Awk

Linux 三剑客之 Awk (由三个创始人的姓氏首字母组成),相比于 Grep 和 Sed 而言更为特殊一些,它是一种模式匹配的编程语言,其主要的作用匹配文本进行处理,其擅长实现对文本的格式化输出,而作为一门编程语言:支持函数,变量,循环,运算,但相对简单。

AWK 的执行逻辑是:搜索文件的每一行,如果发现匹配内容,就执行下一个编程步骤,如果没发现,就继续处理下一行的内容。

Intro

由于 AWK 实际上是一个编程语言,本篇主要只介绍其命令行用法。

首先介绍 AWK 命令,其主要用于匹配文本并格式化输出,适用于对表格化的数据机型处理。其使用模板大致如下:

1
2
3
4
awk [options] 'program' var=value file...
awk [options] 'pattern {action1; action2; ...}' file ...
awk [options] -f programfile var=value file...
awk [options] 'BEGIN{ action;... } pattern{ action;... } END { action;... }' file ...
  • -f scriptfile: 从脚本文件中读取 awk 命令
  • -v var=value: 赋值一个用户定义变量,也可用这种方式修改内置变量
  • -F fs: fs 可为任意字符串或者正则表达式,用于指定分隔符(也可以通过-v 的方式修改内置的分隔符变量来实现)

每个 action 或者说 statement 之间用 分割

参考资料:AWK wikipedia | practical-programming-books/awk.md | 一. AWK入门指南 — AWK程序设计语言 | Linux文本三剑客超详细教程—-grep、sed、awk - alonghub


Grep、Sed、Awk 02 Sed

Grep、Sed、Awk 02 Sed

Linux 三剑客之 Sed,相比于擅长数据查找定位的 Grep,Sed(Stream Editor)擅长做的是数据修改,做的主要是做一些增删改的功能。 sed 和 awk 的区别是什么?

Intro

首先介绍 Sed 命令,Stream Editor 流编辑器,针对字符流来进行文件编辑,同样,其核心也在于正则匹配式,其用法如下:

1
sed [option] {script} [input-file]

其中{script}可以理解为三者的组合:sed 动作指令+Reg 用正则&行号确定修改位置+修改的内容:Script 是 Sed 的核心,分别对应着:操作的行为,操作的位置和操作的内容。

Sed 的用法也可以按照这个来记:

1
sed [-hnV] [-e <script>] [-f <script文件>] [文本文件]

h 显示 helo ;-n 表示静默输出,-V 显示版本;参考第一种用法,-e 可以指定多个 script 对输入的文件进行处理,-f 则可以将多个 script 写在文件中,通过读取文件中的 scripts 来对文本文件进行处理。

作为文本编辑器,Sed 是一行一行的处理文件内容,将正在处理的每一行内容放在缓冲区中按照约定进行修改,处理后按照约定修改文件或输出,接着在处理下一行,直到整个文件处理内容。

其主要用来编辑和处理一个或者多个文件,简化对于文件的重复操作。

参考资料:sed 和 awk 的区别-知乎 | Man | sed 简明教程 | CoolShell | Linux sed 命令 | 菜鸟教程 | Linux文本三剑客超详细教程—-grep、sed、awk


Grep、Sed、Awk 01-Grep

Grep、Sed、Awk 01-Grep

Linux 三剑客之 Grep。Grep 估计会是大部分 Linux 用户最常用的文本搜索命令了,在三剑客中的使用场景也是最广泛的。在对正则有了基本了解之后,就可以更好的使用 Grep,同时也可以通过 Grep 的使用来更好的掌握常用的正则表达式。

Intro

首先介绍 Grep 命令,Global Regular Expression Print 全局正则表达式输出,使用正则表达式搜索文本内容输出。其使用模板如下:

1
grep [option] pattern file
  • option 指定 grep 的搜索模式
  • pattern 需要搜索的内容,可以用正则表达式指定一个模式来做匹配
  • file 可以是文件夹等路径,用来确定搜索的范围(仅支持通配符)[[Linux三剑客之正则]]

接下来分别对两个部分进行简单的说明,file 的范围指定参考正则文章中对通配符的介绍即可。


Grep、Sed、Awk 00 RegExp

Grep、Sed、Awk 00 RegExp

“awk、grep、sed 是 linux 操作文本的三大利器,合称文本三剑客,也是必须掌握的 linux 命令之一。三者的功能都是处理文本,但侧重点各不相同,其中属 awk 功能最强大,但也最复杂。grep 更适合单纯的查找或匹配文本,sed 更适合编辑匹配到的文本,awk 更适合格式化文本,对文本进行较复杂格式处理。“

Linux文本三剑客超详细教程—-grep、sed、awk

在介绍这三个命令之前,需要对正则表达式有所了解,结合正则表达式来使用,才能发挥这 linux 三剑客的的全部能力。

正则表达式 RegExp

正则表达式: Regual Expression 为一类特殊字符和文本符号共通约定的一种 pattern,其中的一些字符并不表示其本身的含义,而是用来做通配符号。

其中基本正则表达式 BRE 是普遍支持的,而拓展正则表达式 ERE 通常则是需要特殊的参数来启用的。通过正则表达式中特殊符号的辅助,能够更快的过滤,查找,替换,处理字符流等。

除了在 grep、sed、awk 的 linux 三剑客中,在各个语言和各种搜索函数的地方,正则表达式都被普遍支持,应用相当广泛。

基础正则表达式对应的元字符主要有以下几个:

1
^ $ . [ ] *

而拓展正则表达式在上述元字符的基础上增加了:

1
( ) { } ? + | 

等字符,接下来我们将逐一展开各个元字符的作用。


Bash Notebook 01

Bash Notebook 01

整理脚本编写的一些最基本语法,包括参数传递,赋值,循环等基本语句,方便后续的脚本编写和改动。

语句注释

单行注释:# ,多行注释:

1
2
3
4
:'
多行注释用冒号加单引号即可
'
echo 'legal'

命令行参数传递

命令行传递参数的方式极其简单,$1$9 可分别代表输入的 9 个参数,第 10 个参数则使用 ${10} 表示,可以将其赋予变量后便于使用。

一些特殊参数:

  1. $0 脚本本身的名称
  2. $# 输入参数的数量
  3. $$$$ 进程 ID
  4. $* | $@ 所有参数(从第一个开始
  5. $(PWD) | `pwd` 都能输出当前的工作路径

举个脚本例子如下:

1
2
3
4
5
6
7
8
9
10
11
12
# we accept args from commandline and print it to the screen
# define
args1=$1
args2=$2

# print
echo "using $ { } to get the value of val, what we receive is : ${args1} and ${args2}"
echo "$ can also show : $args1 and $args2"

# we can make those statement in a string, which may transfer to its value
echo "using $ / {} in a string can also get the value like $args1 and $args2"
echo 'using $ / {} in a string single quotes cannot get the value like $args1 and $args2'