[英]Awk script to select files and print file sizes
我正在做家庭作業。 問題是:
編寫
awk
腳本以選擇/etc
以.conf
結尾的常規文件(不是目錄或鏈接),然后按大小從小到大的.conf
對結果進行排序,計算文件數,然后打印出文件數和文件名和大小在兩列中。 包括文件名和大小的標題行。 將腳本及其輸出粘貼到答案區域。
我真的很努力嘗試通過使用awk使它正常工作。 這是我想出的。
ls -lrS /etc/*.conf |wc –l
將返回數字33
,即目錄中.conf
文件的數量。
ls -lrS /etc/*.conf |awk '{print "File_Size"": " $5 " ""File_Name and Size"": " $9}'
這將在目錄中添加兩列,分別包含.conf
文件的名稱和大小。
它有效,但是我認為這不是他想要的。 我過得很開心。
讓我們看看這里...
選擇所有常規文件(而不是目錄或鏈接)
到目前為止,您還沒有解決這個問題,但是如果要在ls -l...
的輸出中進行管道ls -l...
,這很容易,請選擇
/^-/
因為目錄以d
開頭,符號鏈接以l
開頭,依此類推。 僅普通的舊文件以-
開頭。 現在
打印出跟隨的文件數
好吧,計算比賽數很容易...
BEGIN{count=0} # This is not *necessary*, but I tend to put it in for clarity
/^-/ {count++;}
要獲取文件名和大小,請查看ls -l
的輸出並計數列
BEGIN{count=0}
/^-/ {
count++;
SIZE=$5;
FNAME=$9;
}
這里最大的困難是awk
不能通過排序基元來提供太多功能,因此這是最困難的部分。 可如果你要聰明一點被打敗,但它不是特別有效(見我做了可怕的事情一[代碼高爾夫]解決方案 )。 最簡單的方法是將輸出的一部分通過管道進行sort
,因此...我們將每個文件的一行收集到一個大字符串中
BEGIN{count=0}
/^-/ {
count++
SIZE=$5;
FNAME=$9;
OUTPUT=sprintf("%10d\t%s\n%s",SIZE,FNAME,OUTPUT);
}
END{
printf("%d files\n",count);
printf(" SIZE \tFILENAME"); # No newline here because OUTPUT has it
print OUTPUT|"sort -n --key=1";
}
給輸出像
11 files
SIZE FILENAME
673 makefile
2192 houghdata.cc
2749 houghdata.hh
6236 testhough.cc
8751 fasthough.hh
11886 fasthough.cc
19270 HoughData.png
60036 houghdata.o
104680 testhough
150292 testhough.o
168588 fasthough.o
(順便說一句-這里有一個test
子目錄,您會注意到它沒有出現在輸出中。)
可能是這樣的事情會讓您前進-
ls -lrS /etc/*.conf |
awk '
BEGIN{print "Size:\tFilename:"} # Prints Headers
/^-/{print $5"\t"$9} # Prints two desired columns, /^-/ captures only files
END{print "Total Files = "(NR-1)}' # Uses in-built variable to print count
測試: #后面的文字是注釋,供您參考。
[jaypal:~/Temp] ls -lrS /etc/*.conf |
awk '
BEGIN{print "Size:\tFilename:"}
/^-/{print $5"\t"$9}
END{print "Total Files = "(NR-1)}'
Size: Filename:
0 /etc/kern_loader.conf
22 /etc/ntp.conf
54 /etc/ftpd.conf
105 /etc/launchd.conf
168 /etc/memberd.conf
242 /etc/notify.conf
366 /etc/ntp-restrict.conf
526 /etc/gdb.conf
723 /etc/pf.conf
753 /etc/6to4.conf
772 /etc/syslog.conf
983 /etc/rtadvd.conf
1185 /etc/asl.conf
1238 /etc/named.conf
1590 /etc/newsyslog.conf
1759 /etc/autofs.conf
2378 /etc/dnsextd.conf
4589 /etc/man.conf
Total Files = 18
我首先將使用find /etc -type f -name '*.conf'
類的文件來查找文件; 這樣您就可以獲得正確的文件列表。 然后對它們執行ls -l
(也許使用xargs
)。 然后使用awk
應該很簡單。
但是我不認為如果我做更多的功課對你有幫助。 您需要自己思考並找出答案。
免責聲明:我不是Shell專家。
以為我會試一試,但在回復速度上卻被擊敗了:-):
clear
FILE_COUNT=`find /etc/ -name '*.conf' -type f -maxdepth 1 | wc -l`
echo "Number of files: $FILE_COUNT"
ls -lrS /etc/[^-]*.conf | awk '
BEGIN {print "NAME | SIZE"}\
{print $9," | ",$5}\
END {print "- DONE -"}\
'
我的輸出很丑:-(:
Number of files: 21
NAME | SIZE
/etc/kern_loader.conf | 0
/etc/resolv.conf | 20
/etc/AFP.conf | 24
/etc/ntp.conf | 42
/etc/ftpd.conf | 54
/etc/notify.conf | 132
/etc/memberd.conf | 168
/etc/Symantec.conf | 246
/etc/ntp-restrict.conf | 366
/etc/gdb.conf | 526
/etc/6to4.conf | 753
/etc/syslog.conf | 772
/etc/asl.conf | 860
/etc/liveupdate.conf | 861
/etc/rtadvd.conf | 983
/etc/named.conf | 1238
/etc/newsyslog.conf | 1590
/etc/autofs.conf | 1759
/etc/dnsextd.conf | 2378
/etc/smb.conf | 2975
/etc/man.conf | 4589
/etc/amavisd.conf | 31925
- DONE -
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.