awk 输出指定列

1,命令基本格式

 awk '{print $0}' testfile.txt

结果:

-rw-rw-r-- 1 yxxx yxxx 600 Jun 27 11:55 sed_test
-rwxrwxr-x 1 yxxx yxxx  80 Jun 26 15:23 test1.sh
-rwxrwxr-x 1 yxxx yxxx 111 Jun 26 15:27 test2.sh
-rwxrwxr-x 1 yxxx yxxx 153 Jun 27 14:48 test3.sh

以下命令也以此文件为基础进行命令展示 

注意:使用单引号,双引号得不到预期结果

awk "{print $0}" testfile.txt

结果:

0
0
0
0

 

$0表示所有列

 2,打印指定列

 $列号(从1开始),多个列号可用分号,分隔开。改变大括号中的$3,$1列的顺序,可改变列展示的顺序 。

 awk '{print $1,$3}' testfile.txt

[yxxxn@git22 shelltest]$ awk '{print $1}' testfile.txt
-rw-rw-r--
-rwxrwxr-x
-rwxrwxr-x
-rwxrwxr-x

[yxxxn@git22 shelltest]$ awk '{print $3}' testfile.txt
yxxx
yxxx
yxxx
yxxx

[yxxxn@git22 shelltest]$ awk '{print $1,$3}' testfile.txt
-rw-rw-r-- yxxx
-rwxrwxr-x yxxx
-rwxrwxr-x yxxx
-rwxrwxr-x yxxx

[yxxxn@git22 shelltest]$ awk '{print $3,$1}' testfile.txt
yxxx -rw-rw-r--
yxxx -rwxrwxr-x
yxxx -rwxrwxr-x
yxxx -rwxrwxr-x

$NF表示最后一列。$(NF-1)表示倒数第二列,以此类推

awk '{print $3,$NF}' testfile.txt
yxxx sed_test
yxxx test1.sh
yxxx test2.sh
yxxx test3.sh
awk 'NF>1{print $1,$(NF-1)}' testfile.txt
-rw-rw-r-- 11:55
-rwxrwxr-x 15:23
-rwxrwxr-x 15:27
-rwxrwxr-x 14:48

不加NF>1会有报错:  

awk: cmd. line:1: (FILENAME=testfile.txt FNR=5) fatal: attempt to access field -1

3,打印N列之后的列

 把前N列都赋值空

awk '{for(i=1;i<=3;i++){$i=""}; print $0}' testfile.txt
   yxxx 600 Jun 27 11:55 sed_test
   yxxx 80 Jun 26 15:23 test1.sh
   yxxx 111 Jun 26 15:27 test2.sh
   yxxx 153 Jun 27 14:48 test3.sh

awk '{$1="";$2="";print $0}' testfile.txt
  yxxx yxxx 600 Jun 27 11:55 sed_test
  yxxx yxxx 80 Jun 26 15:23 test1.sh
  yxxx yxxx 111 Jun 26 15:27 test2.sh
  yxxx yxxx 153 Jun 27 14:48 test3.sh

4,循环打印

awk for+printf实现循环打印

printf打印完不加任何符

print打印完加换行符\n 

 awk '{for(i=3;i<=NF;i=i+1){printf $i" "};printf "Hello"}' testfile.txt

yxxx yxxx 600 Jun 27 11:55 sed_test Helloyxxx yxxx 80 Jun 26 15:23 test1.sh Helloyxxx yxxx 111 Jun 26 15:27 test2.sh Helloyxxx yxxx 153 Jun 27 14:48 test3.sh HelloHello

以上命令,打印一行的 3到末尾行,打印完一行后会加"Hello",加上后继续打印下一行,注意行与行直接不换行

5,行间分隔符定义

-F : 指定文本分隔符 (本身默认是以空格作为分隔符)

awk -F'yxxx' '{print $NF}' testfile.txt
 600 Jun 27 11:55 sed_test
  80 Jun 26 15:23 test1.sh
 111 Jun 26 15:27 test2.sh
 153 Jun 27 14:48 test3.sh

 以'yxxx'为分隔符,打印最后一列。

以上及打印列的基本内容。但是awk命令还不止如此:

6,awk命令基础

awk命令命令处理流程:

以下部分,awk中最少有一个,最多有四个!

1. BEGIN{}	: 最开始执行
2. //		: 正则
3. {}		: 循环体
4. END{}	: 最后执行

以:分号分隔符打印第一和第二列 

awk -F: '{print $1,$2}' /etc/passwd

先进行正则匹配,对于又root的行,打印第一和第二列

awk -F: '/root/{print $1,$2}' /etc/passwd

打印结尾列包含 bash的行的第一列和第二列 

awk -F: '$NF ~ /bash/{print $1,$2}' /etc/passwd

begin end 区可以再打印文档内容前后执行

awk 'BEGIN{print "start print file content...1"}{print $0}END{print "end"}' testfile.txt
start print file content...1
-rw-rw-r-- 1 yxxx yxxx 600 Jun 27 11:55 sed_test
-rwxrwxr-x 1 yxxx yxxx  80 Jun 26 15:23 test1.sh
-rwxrwxr-x 1 yxxx yxxx 111 Jun 26 15:27 test2.sh
-rwxrwxr-x 1 yxxx yxxx 153 Jun 27 14:48 test3.sh

end

循环体内还可以是流程控制

awk -F: '{if($3>$4){print "大于"}else{print "小于或等于"}}' /etc/passwd

参考: https://www.cnblogs.com/zhengyan6/p/16290156.html

NR : 用来记录行号

NF用来统计当前的总字段数 (总列数)

$NF最后一列

FS 指定分隔符 

你可能感兴趣的:(linux,运维)