`

awk 命令之常见问题

阅读更多
保留最新的9个文件
ls -t /tmp/ | awk '{if(NR>9){print $0}}' | while read line; do rm -f /tmp/$line; done

#下面的指令在文件太多的时候不能成功执行
ls -t /tmp/ | awk '{if(NR>9){print $0}}' | xargs rm -f

将/home/test 目录下大于10K的文件转移到/tmp目录下
#!/bin/sh
cd /home/test
for i in `ls -l |awk '{if($5>10240) {print $9}}'`
do 
mv $i /tmp
done

 {print $0}           打印所有输出行
 NR==8 { print $0}   打印输入文件第八行
   {if(NR==8){print $0}}
 awk -F: '{print $1}' 打印文件所有行的第一个字段
 awk 'END{print  NR}' 打印输入行总数
 awk -F: '{print $0,NF}'   打印每行字段数
 awk -F: 'END{print $NF}'  打印最后一行的最后一个字段的值
 awk -F: 'NF>=4{print $0}'打印字段多余4行的行
 awk -F: 'BEGIN(num=0) {num=num+NF}END{print num}'      打印文件所有字段的总数
 awk -F: '$3>=30 && $4 <=40{print $1}'                   打印uid在30~40范围的用户名
 {i=NF  while(i>0){printf ("%s:",$i);i=i-1}printf("\n")}倒序排列文件的所有字段
          print直接换行printf需要\n此换行,%s输出字符串
 awk -F: 'NR>=5&&NR<=56{print $0}'     打印5到56行
 awk 'BEGIN{print "Document"}{print $0}'在文件顶部加上标题“Document”
 awk 'NF%2==0{print $0,NF}'  隔行删除偶数行   
 awk 'NF%2==1{print $0,NF}'  隔行删除奇数行
 BEGIN{FS="[^a-zA-Z]"}{i=1,j=0,while(NF-i!=0){if($i){j=j+1}if(j==1){printf("%s "$i)}i=i+1}printf("\n")} 非字母的分段    i定义的字段,j用来判断是否为单词    每行抽出第一个单词
 BEGIN{FS="[^a-zA-Z]"}{i=1,j=0,while(NF-i!=0){if($i){j=j+1}if(j==1&&j==3){printf("%s "$i)}i=i+1}printf("\n")}  打印每行的第一个单词和第三个单词
 BEGIN{FS=":",num=0}{if(NF>5){num=num+NF}}END{print num}    打印字段数大于5个的行总数

1. awk ‘{code}1’ 中的“1”是干什么的?

一个完整的awk语句为:Awk ‘[patten]{action}……’, 其中pattern缺省为1,action缺省为{print}。

那么awk ‘1’完整的写法就是awk ‘1{print}’; 同理,awk ‘{print}’完整的写法也是awk ‘1{print}’。

2. NR和FNR的区别是啥?

NR: 当前行记录数。

FNR: 当前文件的行记录数。

当awk处理的文件数超过1时,NR和FNR才会有区别。例如:
cat file
a
b
c
d
e
f

awk '{print "NR = " NR "  FNR = " FNR, $0}' file
NR = 1  FNR = 1 a
NR = 2  FNR = 2 b
NR = 3  FNR = 3 c
NR = 4  FNR = 4 d
NR = 5  FNR = 5 e
NR = 6  FNR = 6 f

awk '{print "NR = " NR "  FNR = " FNR, $0}' file file
NR = 1  FNR = 1 a
NR = 2  FNR = 2 b
NR = 3  FNR = 3 c
NR = 4  FNR = 4 d
NR = 5  FNR = 5 e
NR = 6  FNR = 6 f
NR = 7  FNR = 1 a
NR = 8  FNR = 2 b
NR = 9  FNR = 3 c
NR = 10  FNR = 4 d
NR = 11  FNR = 5 e
NR = 12  FNR = 6 f

3. Awk怎么引入变量?

有两种方法:

<1>: awk -v var=$VAR '{code}'
<2>: awk '{CODE}'$VAR'{CODE}'
例如:
VAR=XXX

awk -v var=$VAR 'BEGIN{print var}'
XXX

awk 'BEGIN{print "'$VAR'"}'
XXX

推荐使用第一种方法,这样可以避免一些不必要的烦恼。
4. 为什么OFS不起作用?

先看一个例子:
echo 'aaa bbb ccc ddd
aaa bbb ccc ddd
aaa bbb ccc ddd
aaa bbb ccc ddd' |awk -v OFS="|" '{print $0}'
aaa bbb ccc ddd
aaa bbb ccc ddd
aaa bbb ccc ddd
aaa bbb ccc ddd

上面的例子中OFS为什么没有生效呢,原因是OFS指的是输出字段分隔符,所以必须对字段进行操作时OFS才会起作用,正确的方法应该是:
echo 'aaa bbb ccc ddd
aaa bbb ccc ddd
aaa bbb ccc ddd
aaa bbb ccc ddd' |awk -v OFS="|" '{$1=$1;print $0}'
aaa|bbb|ccc|ddd
aaa|bbb|ccc|ddd
aaa|bbb|ccc|ddd
aaa|bbb|ccc|ddd
正如Tim大师所讲的,$1=$1这个action,是我们对awk撒的谎,目的就是为了使得OFS生效,除此之外,NF+=0也是常用的方法。

5. print,printf 和sprintf?

print:默认有个换行\n,为一般的打印

printf:可以定义打印格式,能打印各种格式,但默认没有换行。

sprintf:可以完成和printf相同的功能,不同的是sprintf只能输出值,并不能完成打印的功能。
awk 'BEGIN{var=123; print "var = " var}'
var = 123

awk 'BEGIN{var=123;printf "%s %5f\n", "var =",var}'
var = 123.000000

awk 'BEGIN{var=123;sprintf ("%s  %5f\n", "var =",var)}'


awk ‘BEGIN{var1=123;var2=sprintf ("%5f",var1); print "var2 =" var2}’
var2 = 123.000000

6. 如何打印单双引号?
awk 'BEGIN {print "single quote --> \047";print "double quote --> \042" }'

7. awk 语句中多个{}是怎么执行的?
cat file
1
2
3
4
5

awk '$1==3{printf "|| "$0}{printf " @@ "$0}{print $0}' file # 这个语句中包含三个action
@@ 11   # 判断$1==3?否;执行 action {printf " @@ "$0};执行 action {print $0}
@@ 22   # 判断$1==3?否;执行 action {printf " @@ "$0};执行 action {print $0}
|| 3 @@ 33  # 判断$1==3?是,执行{print “|| “$0}; 执行 action {printf " @@ "$0};执行 action {print $0}
@@ 44  # 判断$1==3?否;执行 action {printf " @@ "$0};执行 action {print $0}
@@ 55  # 判断$1==3?否;执行 action {printf " @@ "$0};执行 action {print $0}

这样可以清楚的看出,awk是一行一行读取文本,然后按照代码的前后顺序执行。但如果action中包含next或exit时,有所不同:
awk '$1==3{printf "|| "$0;next}{printf "@@ "$0}{print $0}' file
@@ 11
@@ 22
|| 3@@ 44
@@ 55

awk '$1==3{printf "|| "$0;exit}{printf "@@ "$0}{print $0}' file
@@ 11
@@ 22
|| 3


分享到:
评论

相关推荐

    AWK命令详解 sed命令详解

    ### AWK命令详解 **AWK** 是一种强大的文本处理工具,在 Unix 和类 Unix 操作系统中非常常见。它能够方便地对文本进行格式化、提取数据或执行其他操作。AWK 的名称来源于其创造者 Alfred Aho、Peter Weinberger 和 ...

    Linux_awk命令详解

    Linux中的awk命令是一个强大的文本分析工具,用于处理和解析文件中的数据。awk的名称来源于它的创始人: Alfred V. Aho, Peter J. Weinberger, 和 Brian W. Kernighan。awk有三个主要版本:awk、nawk(new awk)和...

    Linuxawk命令详解[归类].pdf

    awk 的常用选项 option 有: ① -F fs : 使用 fs 作为输入记录的字段分隔符,如果省略该选项,awk 使用环境变量 IFS 的值 ② -f filename : 从文件 filename 中读取 awk_script ③ -v var=value : 为 awk_script...

    linux awk 命令大全

    首先,`awk`有三个主要版本:`awk`、`nawk`和`gawk`,其中`gawk`是GNU Awk,是最常用的版本。`awk`的主要功能是根据用户定义的规则从文本文件中提取和格式化信息。它可以用来处理结构化的或非结构化的数据,如日志...

    shell中的awk命令

    shell中的awk命令 文章目录shell中的awk命令1.awk–“样式扫描和处理语言”2.awk模式匹配3.记录和域4.指定分隔符`-F “”` 指定分隔符`FS=””` 指定分隔符5.关系和布尔运算值6.表达式7.系统变量8.格式化输出9.内置...

    awk命令简介

    ### awk命令简介与应用知识点详解 #### 一、awk命令概述 `awk`是一种强大的文本处理工具,在Linux和Unix环境中非常常见。它主要用于在数据文件或其他流中执行模式扫描和处理,可以用来格式化文本输出,执行计算,...

    awk 命令简明教程

    ### awk命令简明教程 **什么是awk?** awk是一个由Aho、Weinberg和Kernighan三位计算机科学家创造的样式扫描与处理工具。它并非一个常见的英语词汇,也不是首字母缩写词,而是源自这三位创始人的姓氏首字母。awk的...

    Awk命令使用实例.docx

    ### Awk命令使用详解 #### 一、Awk简介 Awk是一种强大的文本处理语言,专为高级文本处理和数据分析而设计。它被广泛应用于快速编写脚本来处理文本文件,如日志文件、配置文件等。Awk的核心功能在于能够方便地对文本...

    linux grep sed awk命令详解

    ### Linux grep sed awk命令详解 #### 一、grep命令详解 **grep** 是一个用于查找文件里符合条件的字符串的强大工具。它可以对文件进行快速搜索,找出含有特定模式的行。 - **基本语法**:`grep [选项] 模式 文件...

    awk命令详解

    根据提供的文件信息,这里将对`awk`命令进行详细的解析与说明。`awk`是一种强大的文本处理工具,常用于Linux/Unix环境中。它能够通过指定的模式或规则来读取、处理并输出文本数据。 ### awk 命令概述 #### 命令...

    shell中常见命令与awk,sed的等价命令

    本文将详细介绍一系列常用的shell命令及其在`awk`和`sed`中的等价实现方法。 #### 二、等价命令详解 ##### 1. `cat` **Shell命令:** `cat &lt;file&gt;` **Sed等价命令:** `sed 'p' &lt;file&gt;` **Awk等价命令:** `awk '{...

    sed和awk单行命令比较

    本文将对两种常见的文本处理工具——`sed`和`awk`进行详细的对比分析,并通过具体的示例来说明这两种工具在处理文本时的不同之处。 #### 1. 基本介绍 - **sed** (stream editor):是一种流编辑器,主要用于对输入流...

    Linux主要shell命令、sed、awk使用详解

    Linux 主要shell命令、sed、awk使用详解 Linux 主要shell命令详解 shell 是用户和 Linux 操作系统之间的接口。Linux 中有多种 shell,其中缺省使用的是 Bash。本章讲述了 shell 的工作原理,shell 的种类,shell ...

    LINUX的awk和sed的常用用法

    LINUX 的 awk 和 sed 的常用用法 awk 是一种功能强大的文本处理工具,它可以在文件或字符串中基于指定规则浏览和抽取信息。awk 语言的最基本功能是在文件或字符串中基于指定规则浏览和抽取信息。 调用 awk 有三种...

    awk教程-awk教程.rar

    **awk命令详解** awk是一种强大的文本分析工具,广泛应用于Linux和Unix系统中,用于处理结构化数据,如CSV、TSV格式的文件。它通过模式匹配和动作来处理输入流中的每一行,允许用户定制复杂的文本处理逻辑。下面将...

    三剑客之【awk】.html

    awk命令常用用法整理;加入了自己在平时运用中的实例,比如通过查询数据库生成csv文件或insert语句。将markdown文件转换成了html文件。 awk有许多强大的字符串函数 gsub(r,s) #在整个$0中,用s代替r gsub(r,s,t) 在...

    awk详细用法小结awk awk

    #### 二、awk命令格式与选项 ##### 2.1 awk命令格式 awk的使用可以通过两种基本方式: - awk [options]'script' var=value file(s) - awk [options] -f scriptfile var=value file(s) 其中,script是以单引号括...

Global site tag (gtag.js) - Google Analytics