Friday, October 28, 2022

[SOLVED] Linux/Unix using awk function with logical &&

Issue

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

I need to output the 3 files ".ghost..." and their file size. With the header name and size.

Im trying to use a logical AND (&&) to achieve this effect. Only after both conditions are satisfied, proceed to print the information. Add a header ,"Name", "Size" to your results. Add this awk script (preceded by ls -l |) to the content of script1_tXX


Solution

Let your's ls -la output be

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

then

$9 == "."

does check if whole 9th field is just dot, this condition only holds for one line in your's ls -la output namely

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

but you want to

output the 3 files ".ghost..."

so you should be looking for .ghost somewhere inside 9th field, this for example might be expressed as

$9 ~ /\.ghost/

note that . needs to be escaped to mean literal dot, above condition holds for lines

-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

if you wish to exclude dirs you might do that by adding condition

!/^d/

which might be read as line does not (!) starts with (^) character d, therefore complete condition might be written as

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

which does hold for

-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 

Disclaimer: this assumes you never uses any whitespace in files names.

(test in gawk 4.2.1)



Answered By - Daweo
Answer Checked By - Timothy Miller (WPSolving Admin)