Linux/Unix使用带逻辑&&的awk函数

ldfqzlk8  于 2022-11-02  发布在  Linux
关注(0)|答案(2)|浏览(181)
ls -la | awk 'BEGIN {printf "%s\t%s\n","Name","Size"}{if ($9 == "." && $5 == 0) print $9,"\t"$5}'

drwxrws---+ 6 rsy512 group20 4096 Oct 24 20:54 .
drwxrws---+ 6 root   group20   68 Oct 24 14:19 ..
-rwxrw----. 1 rsy512 group20  568 Mar  3  2010 adhoc
-rw-r-----. 1 rsy512 group20    0 Mar  3  2010 .ghost1.c
-rw-r-----. 1 rsy512 group20    0 Mar  3  2010 .ghost2
-rw-r-----. 1 rsy512 group20    0 Mar  3  2010 .ghost3.cpp 
drwxr-s---+ 2 rsy512 group20    6 Mar  3  2010 .ghostdir
-rwxrw----. 1 rsy512 group20   21 Feb 17  2010 input4.txt
-rwxrw----. 1 rsy512 group20 1878 Feb 26  2008 lab1.cpp
-rwxrw----. 1 rsy512 group20 1171 Feb  4  2010 Lab2.cpp
-rwxrw----. 1 rsy512 group20 1013 Mar  3  2010 proc
-rwxrw----. 1 rsy512 group20  109 Mar  3  2010 prog1.c
-rwxrw----. 1 rsy512 group20  104 Mar  3  2010 prog2.c
-rwxrw----. 1 rsy512 group20    0 Mar  3  2010 prog3.c.txt
-rwxrw----. 1 rsy512 group20    0 Mar  3  2010 prog.4c 
drwxrws---+ 2 rsy512 group20    6 Mar  3  2010 programs.c 
drwxrws---+ 2 rsy512 group20    6 Mar  3  2010 programs.cpp
-rw-rw----. 1 rsy512 group20   46 Oct 24 20:54 script1_t20 
drwxrws---+ 2 rsy512 group20    6 Mar  3  2010 test1

我需要输出的3个文件“. ghost...”和他们的文件大小。与标题名称和大小。
我尝试使用逻辑AND(&&)来达到这个效果。只有在两个条件都满足之后,才能继续打印信息。在结果中添加一个标题“Name”和“Size”。添加下面的awk脚本(前面加上ls -l|)到script1_tXX的内容

lnvxswe2

lnvxswe21#

将的ls -la输出设为

drwxrws---+ 6 rsy512 group20 4096 Oct 24 20:54 .
drwxrws---+ 6 root   group20   68 Oct 24 14:19 ..
-rwxrw----. 1 rsy512 group20  568 Mar  3  2010 adhoc
-rw-r-----. 1 rsy512 group20    0 Mar  3  2010 .ghost1.c
-rw-r-----. 1 rsy512 group20    0 Mar  3  2010 .ghost2
-rw-r-----. 1 rsy512 group20    0 Mar  3  2010 .ghost3.cpp 
drwxr-s---+ 2 rsy512 group20    6 Mar  3  2010 .ghostdir
-rwxrw----. 1 rsy512 group20   21 Feb 17  2010 input4.txt
-rwxrw----. 1 rsy512 group20 1878 Feb 26  2008 lab1.cpp
-rwxrw----. 1 rsy512 group20 1171 Feb  4  2010 Lab2.cpp
-rwxrw----. 1 rsy512 group20 1013 Mar  3  2010 proc
-rwxrw----. 1 rsy512 group20  109 Mar  3  2010 prog1.c
-rwxrw----. 1 rsy512 group20  104 Mar  3  2010 prog2.c
-rwxrw----. 1 rsy512 group20    0 Mar  3  2010 prog3.c.txt
-rwxrw----. 1 rsy512 group20    0 Mar  3  2010 prog.4c 
drwxrws---+ 2 rsy512 group20    6 Mar  3  2010 programs.c 
drwxrws---+ 2 rsy512 group20    6 Mar  3  2010 programs.cpp
-rw-rw----. 1 rsy512 group20   46 Oct 24 20:54 script1_t20 
drwxrws---+ 2 rsy512 group20    6 Mar  3  2010 test1

然后

$9 == "."

会检查整个第9个字段是否为点,此条件仅适用于ls -la输出中的一行,即

drwxrws---+ 6 rsy512 group20 4096 Oct 24 20:54 .

但是你想
输出3个文件“. ghost ...”
因此,您应该在第9个字段中查找.ghost,例如,可以将其表示为

$9 ~ /\.ghost/

请注意,.需要转义为表示文字点,上述条件适用于行

-rw-r-----. 1 rsy512 group20    0 Mar  3  2010 .ghost1.c
-rw-r-----. 1 rsy512 group20    0 Mar  3  2010 .ghost2
-rw-r-----. 1 rsy512 group20    0 Mar  3  2010 .ghost3.cpp 
drwxr-s---+ 2 rsy512 group20    6 Mar  3  2010 .ghostdir

如果您希望排除目录,可以通过添加条件来实现

!/^d/

这可能被读作行不以(^)字符d开始(!),因此完成条件可能被写为

!/^d/ && $9 ~ /\.ghost/ && $5 == 0

这确实适用于

-rw-r-----. 1 rsy512 group20    0 Mar  3  2010 .ghost1.c
-rw-r-----. 1 rsy512 group20    0 Mar  3  2010 .ghost2
-rw-r-----. 1 rsy512 group20    0 Mar  3  2010 .ghost3.cpp

免责声明:这假定您从不在文件名中使用任何空格。

  • (在呆呆4.2.1中测试)*
bvjxkvbb

bvjxkvbb2#

你可以用find来做所需的过滤,不确定打印0大小是否可以,但它在这里。

$  { echo -e "name\tsize"; find . -type f -name ".*" -size 0 -printf "%p\t%k KB\n"; } | 
     column -ts$'\t'

相关问题