我正在做家务工作。问题是:
编写
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
文件的名称和大小。
它有效,但我不认为这是他正在寻找的东西。我有一个愉快的时间。
答案 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 -