用于选择文件和打印文件大小的awk脚本

时间:2011-12-18 20:05:05

标签: linux bash scripting awk

我正在做家务工作。问题是:

  

编写awk脚本以选择所有常规文件(不是目录或   以/etc结尾的.conf中的链接),按大小对结果进行排序   从最小到最大,计算文件数,并打印出来   文件数,后跟两列中的文件名和大小。   包含文件名和大小的标题行。粘贴你的   脚本及其在答案区域的输出。

我真的很想通过使用awk来解决这个问题。这就是我想出来的。

 ls -lrS /etc/*.conf |wc –l 

将返回数字33,即目录中文件.conf文件的数量。

 ls -lrS /etc/*.conf |awk '{print "File_Size"": " $5 "   ""File_Name and Size"": " $9}'

这将使2列具有目录中.conf文件的名称和大小。

它有效,但我不认为这是他正在寻找的东西。我有一个愉快的时间。

4 个答案:

答案 0 :(得分:5)

让我们看看......

  

选择所有常规文件(不是目录或链接)

到目前为止,你还没有解决这个问题,但如果你在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没有通过排序原语提供太多,所以这是困难的部分。如果你想要聪明但可以被打败,但它不是特别有效(参见我在a [code-golf] solution中所做的糟糕的事情)。 easy (和unixy)要做的事情是将输出的一部分传递给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子目录,你会注意到它没有出现在输出中。)

答案 1 :(得分:1)

可能是这样的事情应该让你在路上 -

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

答案 2 :(得分:0)

我首先会找到类似find /etc -type f -name '*.conf'的文件;所以你得到了正确的文件列表。然后你对它们ls -l(可能使用xargs)。然后使用awk应该很简单。

但我不认为如果我做更多的功课会对你有所帮助。你需要自己思考并找出答案。

答案 3 :(得分:0)

免责声明:我不是外壳专家。

以为我会这样做,但是在答复的速度上被打败了:-):

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 -