Contents

在Linux中显示文件中的特定列

1. 概述

作为 Linux 用户,我们经常对文件进行各种操作。例如,一种常见的操作是显示文件中的特定列。

在本教程中,我们将讨论实现此目的的各种方法。

2. 显示单列

让我们创建一个文件作为示例。input.txt文件包含长列表格式的ls 命令的输出:

$ cat input.txt 
-rw-r--r-- 1 jarvis jarvis 200M Apr 27 22:04 file1.dat
-rw-r--r-- 1 jarvis jarvis 400M Apr 27 22:04 file2.dat
-rw-r--r-- 1 jarvis jarvis 500M Apr 27 22:04 file3.dat
-rw-r--r-- 1 jarvis jarvis 600M Apr 27 22:04 file4.dat
-rw-r--r-- 1 jarvis jarvis 700M Apr 27 22:04 file5.dat

我们可以使用*awk 命令来显示特定的列。让我们打印文件中的第5*列:

$ awk '{print $5}' input.txt 
200M
400M
500M
600M
700M

让我们看看我们在awk命令中使用的选项:

  • print:它是awk 的内置函数,将文本打印到标准输出流
  • $5:它代表第5列的文件大小

请注意,awk使用$N*来表示第 N列。例如,$2 代表第 2列。*

我们还可以使用cut 命令来显示特定的列。让我们使用cut命令打印同一列:

$ cut -d' ' -f5 input.txt 
200M
400M
500M
600M
700M

让我们看一下我们在cut命令中使用的选项:

  • -d:表示字段分隔符。它的默认值是一个制表
  • -f5 : 它代表第5列的文件大小

3. 显示多列

我们也可以使用awk来显示多列。让我们打印文件名及其大小:

$ awk '{print $9 " " $5}' input.txt 
file1.dat 200M
file2.dat 400M
file3.dat 500M
file4.dat 600M
file5.dat 700M

让我们看看我们在awk命令中使用的选项:

  • $9:代表第9列的文件名

也可以使用cut命令显示多列。例如,我们可以使用逗号分隔列表指定多个列,如下所示:

$ cut -d' ' -f9,5 input.txt 
200M file1.dat
400M file2.dat
500M file3.dat
600M file4.dat
700M file5.dat

请注意,无法使用cut命令重新排列列顺序。所选输入的写入顺序与读取顺序相同。

4. 列的显示范围

有时,当要显示的列数很大时,使用循环会很方便。让我们打印 3 到 8 范围内的所有列:

$ awk '{ for (i = 3; i <= 8; ++i) printf $i" "; print ""}' input.txt 
jarvis jarvis 200M Apr 27 22:04 
jarvis jarvis 400M Apr 27 22:04 
jarvis jarvis 500M Apr 27 22:04 
jarvis jarvis 600M Apr 27 22:04 
jarvis jarvis 700M Apr 27 22:04 

让我们看一下我们在awk命令中使用的选项:

  • for:它是awk的循环结构
  • printf:它是awk 的内置函数,将格式化文本打印到标准输出流

我们可以使用cut命令来达到同样的效果。它允许我们使用连字符指定一系列列,如下所示:

$ cut -d' ' -f3-8 input.txt 
jarvis jarvis 200M Apr 27 22:04
jarvis jarvis 400M Apr 27 22:04
jarvis jarvis 500M Apr 27 22:04
jarvis jarvis 600M Apr 27 22:04
jarvis jarvis 700M Apr 27 22:04

5. 更改awk的字段分隔符

默认情况下,awk使用空格字符作为列分隔符。但是,我们可以根据我们的要求对其进行修改。首先,让我们通过用逗号替换空格来修改我们的原始输入文件。现在修改后的文件如下所示:

$ cat input.txt 
-rw-r--r--,1,jarvis,jarvis,200M,Apr 27 22:04,file1.dat
-rw-r--r--,1,jarvis,jarvis,400M,Apr 27 22:04,file2.dat
-rw-r--r--,1,jarvis,jarvis,500M,Apr 27 22:04,file3.dat
-rw-r--r--,1,jarvis,jarvis,600M,Apr 27 22:04,file4.dat
-rw-r--r--,1,jarvis,jarvis,700M,Apr 27 22:04,file5.dat

让我们使用逗号作为列分隔符打印文件名、大小和时间戳:

$ awk -F"," '{print $7 " " $5 " " $6}' input.txt 
file1.dat 200M Apr 27 22:04
file2.dat 400M Apr 27 22:04
file3.dat 500M Apr 27 22:04
file4.dat 600M Apr 27 22:04
file5.dat 700M Apr 27 22:04

让我们看看我们在awk命令中使用的选项:

  • -F:表示字段分隔符

请注意,在第6列中,为了演示字段分隔符的使用,并未有意将空格替换为逗号。