Linux命令操作:用sort和awk命令,进行复杂条件过滤

Posted 一口Linux

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux命令操作:用sort和awk命令,进行复杂条件过滤相关的知识,希望对你有一定的参考价值。

原文:https://www.toutiao.com/i6968352645211963941/

 

多,浩如烟海,参数之杂,多如繁星。需求引导,用到再学。以使用为目的,适当延伸,是一个最实际最有效的办法。

某天,我突然想生成一个文件,记录/dev下的设备文件,要求如下:

  • “ls -l /dev”是数据输出源,因为这个命令会列出/dev下面的设备文件,并带有主次ID信息。
  • 要按照设备主ID由小到大、次ID号由小到大的顺序显示。
  • 只想输出主ID、次ID和设备文件名
  • fifo管道、socket、软/硬连接、目录,这些东西没有主/次设备号,所以要过滤掉。
  • 把过滤结果输出到"dev_id.txt"文件中去

OK,带着这些要求,结合上面的记录心得,一步步地来实现。

(1)“ls -l /dev”输出源数据,这个没有啥可说的。

(2)要按照设备主ID由小到大、次ID号由小到大的顺序显示

这个要用到sort输出:sort -n -k5 -k6

$ ls -l  /dev | sort -n -k5 -k6 
总用量 0
drwxr-xr-x  2 root      root             0 5月  30 10:41 hugepages
drwxr-xr-x  2 root      root             0 5月  30 10:41 pts
crw-r-----  1 root      kmem        1,   1 5月  30 10:41 mem
crw-rw-rw-  1 root      root        1,   3 5月  30 10:41 null
crw-r-----  1 root      kmem        1,   4 5月  30 10:41 port
crw-rw-rw-  1 root      root        1,   5 5月  30 10:41 zero
crw-rw-rw-  1 root      root        1,   7 5月  30 10:41 full
crw-rw-rw-  1 root      root        1,   8 5月  30 10:41 random
crw-rw-rw-  1 root      root        1,   9 5月  30 10:41 urandom
crw-r--r--  1 root      root        1,  11 5月  30 10:41 kmsg
crw--w----  1 root      tty         4,   0 5月  30 10:41 tty0
crw--w----  1 root      tty         4,   1 5月  30 10:41 tty1
crw--w----  1 songguoya tty         4,   2 5月  30 10:41 tty2
crw-------  1 root      tty         4,   3 5月  31 11:03 tty3
crw--w----  1 root      tty         4,   4 5月  31 11:04 tty4
crw--w----  1 root      tty         4,   5 5月  31 11:01 tty5
lrwxrwxrwx  1 root      root             4 5月  30 10:41 rtc -> rtc0
... ...

(3)只想输出主ID、次ID和设备文件名

主ID、次ID和设备文件名这三列,对应的列序号是5、6和10。也就是使用awk的print参数:awk '{print $5,$6,$10}'

$ ls -l  /dev | sort -n -k5 -k6 | awk '{print $5,$6,$10}'
  
0 5月 
0 5月 
1, 1 mem
1, 3 null
1, 4 port
1, 5 zero
1, 7 full
1, 8 random
1, 9 urandom
1, 11 kmsg
4, 0 tty0
4, 1 tty1
4, 2 tty2
4, 3 tty3
4, 4 tty4
4, 5 tty5
4 5月 ->

(4)过滤掉没有主次ID的行

经检查,发现有主次ID的行,列数为10。如果列数小于9,就是没有主次ID的项目。要使用awk的if参数:awk '{if (NF == 10) print $5,$6,$10}'

$ ls -l  /dev | sort -n -k5 -k6 | awk '{if (NF == 10) print $5,$6,$10}'
1, 1 mem
1, 3 null
1, 4 port
1, 5 zero
1, 7 full
1, 8 random
1, 9 urandom
1, 11 kmsg
4, 0 tty0
...
4, 63 tty63
4, 64 ttyS0
...
4, 95 ttyS31
5, 0 tty
5, 1 console
5, 2 ptmx
5, 3 ttyprintk
7, 0 loop0

(5)把过滤结果输出到"dev_id.txt"文件中去

输出重定向>就可以了。

$ ls -l  /dev | sort -n -k5 -k6 | awk '{if (NF == 10) print $5,$6,$10}' > dev_id.txt

其实,这个命令行并不完美,因为结果中还有一些逗号“,”混杂其中。可以借助tr命令把逗号转成空格,这样结果就很好了。

$ ls -l  /dev | sort -n -k5 -k6 | awk '{if (NF == 10) print $5,$6,$10}' | tr ',' ' ' > dev_list.txt

最后,写完此文,感觉自己好像在记述上古时代的东西一般!

能看到此处的你,想必也是同道中人了。如果也觉得这些东西无聊无用的话,请吐槽留言!

 

以上是关于Linux命令操作:用sort和awk命令,进行复杂条件过滤的主要内容,如果未能解决你的问题,请参考以下文章

Linux常用文本操作命令整理

Linux命令如何删除文件里面的重复行

Linux命令如何删除文件里面的重复行

Linux删除文件内重复行

linux中sort命令的简单用方法?

ios查看当前linux系统有多少条http链接的命令