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命令,进行复杂条件过滤的主要内容,如果未能解决你的问题,请参考以下文章