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
$0表示所有列
$列号(从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
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
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",加上后继续打印下一行,注意行与行直接不换行
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命令还不止如此:
以下部分,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 指定分隔符