簡體   English   中英

AWK腳本來選擇文件並打印文件大小

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM