[转帖]awk 中 FS的用法

awk,fs,用法 · 浏览次数 : 0

小编点评

**awk脚本解析:** ```bash machine=$(awk 'BEGIN{FS=\"[ \\t]+:[ \\t]\"} /machine/ {print $2}' /proc/cpuinfo) ``` 1. `machine=$(awk '...' /proc/cpuinfo)`:使用 `awk` 读取 `/proc/cpuinfo` 文件中的 `machine` 字段,并将其存储在 `machine` 中。 2. `FS=\"[ :]+\"`:定义行分隔符为 `[ :]+`,即一个或多个空格和单引号。 3. `/machine:`:指定以 `machine` 为开始的那一行。 4. `print $2`:从结果中获取第二个字段的值(设备类型)。 **结果:** ``` Atheros AP143 reference board ``` **补充知识:** * `NF`:行数(每行被分成多少字段)。 * `NR`:记录数(已读的行数)。 * `RS`:记录分隔符。 * `FS`:行分隔符。 * `BEGIN`和`END`:用于定义块的开始和结束。 * `print $0`:打印每行中的所有字段。 * `print $1`:打印每行中的第一个字段。 * `print NR`:打印行号。 * `print NF`:打印段数(每行被分成多少段)。

正文

https://www.cnblogs.com/rohens-hbg/p/5510890.html

 

在openwrt文件 ar71xx.sh中

查询设备类型时,有这么一句,

machine=$(awk 'BEGIN{FS="[ \t]+:[ \t]"} /machine/ {print $2}' /proc/cpuinfo)
解决:
1)查看cpuinfo
root@hbg:/dev# cat  /proc/cpuinfo
system type             : Qualcomm Atheros QCA9533 rev 2
machine                 : Atheros AP143 reference board
processor               : 0
cpu model               : MIPS 24Kc V7.4
BogoMIPS                : 432.53
wait instruction        : yes
microsecond timers      : yes
tlb_entries             : 16
extra interrupt vector  : yes
hardware watchpoint     : yes, count: 4, address/irw mask: [0x0000, 0x0ff8, 0x0ff8, 0x0ff8]
isa                     : mips1 mips2 mips32r1 mips32r2
ASEs implemented        : mips16
shadow register sets    : 1
kscratch registers      : 0
core                    : 0
VCED exceptions         : not available
VCEI exceptions         : not available
2)awk截取信息, FS为指定格式; 以 “:” 冒号为分界符,两边都是制表符"\t",第二个参数
   /machine指定了以machine为开始的那一行
  
所以命令的结果是:
Atheros AP143 reference board  

 

==============================================

补充知识:

awk中常见的内建变量(Built-in Variables)

NF( Number of Fields ) : awk 读入一行数据的字段数,通俗地说,就是一行数据被划分成了几段?便于对各字段进行遍历。
NR( Number of Records ) : awk 已读入的行数,相当于一个计数器。
RS( Record Separator ) : 行分隔符。awk从文件上读取资料时, 将根据 RS 的定义把资料切割成许多Records,而awk一次仅读入一个Record,以进行处理。预设值是'\n'
FS( Field Separator ) : 列分割符。决定了怎么将一行划分为几段。预设值是 空白符(空白和Tab)
FILENAME : awk 正在处理的数据文件名

例如:

创建一个 data.txt的文件,内如如下:(共3行,其中第三行为空)

a:b   c:d    123

w:q   d:e    234

 

执行命令:

 

hbg@root:~/dl/test$ awk 'BEGIN{FS="[ :]+"}{print $0, $1, NR, NF}' data.txt
a:b c:d 123 a 1 5
q:w d:e 234 q 2 5
  3 0
hbg@root:~/dl/test$ awk 'BEGIN{FS="[ :]+"}{print $0}' data.txt       // 打印所有数据
a:b c:d 123
q:w d:e 234

 

hbg@root:~/dl/test$ awk 'BEGIN{FS="[ :]+"}{print $1}' data.txt      // 打印分隔符的第一列
a
q

 

hbg@root:~/dl/test$ awk 'BEGIN{FS="[ :]+"}{print $2}' data.txt      // 打印分隔符的第二列
b
w

 

hbg@root:~/dl/test$ awk 'BEGIN{FS="[ :]+"}{print NR}' data.txt     // 打印行号
1
2
3
hbg@root:~/dl/test$ awk 'BEGIN{FS="[ :]+"}{print NF}' data.txt    // 段数(一行被分成了几段)
5
5
0
hbg@root:~/dl/test$

与[转帖]awk 中 FS的用法相似的内容:

[转帖]awk 中 FS的用法

https://www.cnblogs.com/rohens-hbg/p/5510890.html 在openwrt文件 ar71xx.sh中 查询设备类型时,有这么一句, machine=$(awk 'BEGIN{FS="[ \t]+:[ \t]"} /machine/ {print $2}' /

[转帖]19.awk报告生成器,文本解释器

在本博客中,AWK是一个系列文章,本人会尽量以通俗易懂的方式递进的总结awk命令的相关知识点。 awk系列博文直达链接:AWK命令总结之从放弃到入门 我们先来用专业的术语描述一下awk是什么,如果你看不懂,没关系,我们会再用”大白话”解释一遍。 awk是一个报告生成器,它拥有强大的文本格式化的能力,

[转帖]Linux中awk命令正确的求最大值、最小值、平均值、总和

`https://blog.csdn.net/fireblue1990/article/details/51622416` test.txt文件内容: 9 11 35 21 42 118 求最大值: awk 'BEGIN {max = 0} {if ($1+0 > max+0) max=$1} EN

[转帖]awk(四) 字符串函数(gsub替换)

https://www.jianshu.com/p/d465f4dccbbe 1. gsub(r,s) 在整个$0中用s替代r 删除文件中所有逗号awk 'gsub(",", ""){print}' input.file# 注意gsub内部用双引号"" 2. gsub(r,s,t) 在整个t中用s替

[转帖]awk(三) 列运算

https://www.jianshu.com/p/b46f783832e3 1. 求每一行中指定列的最大/小值 awk '{m=0;for(x=5;x<=NF;x++)if($x>m) {m=$x};print m}' input.file # 求第5列到最后一列中每行的最大值 awk '{m=0

[转帖]《AWK程序设计语言》笔记(1)—— AWK入门与简单案例

原文为 《The AWK Programming Language》,GitHub上有中译版,不过有些内容翻译的比较奇怪,建议跟原版对照着看 https://github.com/wuzhouhui/awk 本篇的小案例基本均基于文件 emp.data,三个字段分别为:员工名、每小时工资、工作时长,

[转帖]awk提取某一行某一列的数据

https://www.jianshu.com/p/dbcb7fe2da56 1、提取文件中第1列数据 awk '{print $1}' filename > out.txt 2、提取前2列的文件 awk `{print $1,$2}' filename > out.txt 3、打印完第一列,然后打

[转帖]awk(五) 字符串函数(substr截取)

https://www.jianshu.com/p/bee599fabe85 1. substr(s,p) 返回字符串s中从p开始到最后部分 每一行从第101个字符开始截取到末尾awk '{print substr($0, 101)}' input.file 2. substr(s,p,n) 返回字

[转帖]Linux文本处理三剑客之awk学习笔记05:getline用法详解

https://www.cnblogs.com/alongdidi/archive/2021/01/19/awkGetline.html getline用法详解 在默认情况下,awk支持从文件或者STDIN中读取数据。我们也可以使用getline来灵活读取数据,例如在main代码块执行过程中读取某个

[转帖]Linux文本处理三剑客之awk学习笔记05:getline用法详解

https://www.cnblogs.com/alongdidi/p/awkGetline.html getline用法详解 在默认情况下,awk支持从文件或者STDIN中读取数据。我们也可以使用getline来灵活读取数据,例如在main代码块执行过程中读取某个非待处理文件的数据,或者从某个读取