注:原题出自老男孩教育
1、创建一个目录/data。
解答:mkdir /data
2、在/data下面建立一个文件oldboy.txt
解答:
方法一:touch /data/oldboy.txt
方法二:cat >> oldboy.txt <<EOF
>EOF
注:此处最后的EOF必须换行后输入,“>”是换行后的输入提示符。
方法三:>oldboy.txt
3、为oldboy.txt增加内容“I am studying linux.”。
解答:
方法一:echo “I am studying linux.” > oldboy.txt
方法二:cat >> oldboy.txt <<EOF
>I am studying linux.
>EOF
注:使用这个命令,<<EOF后,必须换行输入,最后的EOF也必须换行后输入。
方法三:vi oldboy.txt
按“i”键,进入输入模式,输入“I am studying linux.”然后按“Esc”键,回到命令行模式,再按“:”进入尾行模式输入“wq”保存退出。(也可以在命令名模式输入“ZZ”,“Z”是按“shift + z”实现,快捷保存退出)
4、把oldboy.txt文件拷贝到/tmp下。
解答:cp oldboy.txt /tmp/.
注:此处oldboy.txt文件可以带绝对路径,直接使用文件名时,该文件必须在当前目录下。
5、把/data目录移动到/root下。
解答:mv /data/ /root/.
注:移动目录最好不要在被移动的目录下操作。
6、进入/root目录下的data目录,删除oldboy.txt文件。
解答:
cd /root/data/
rm -f oldboy.txt
注:root用户默认对rm做了别名处理,不加-f参数,会提示是否要删除该文件,出现提示,输入y按回车就行。
7、接第6题,退出到上一级目录,删除data目录。
解答:
cd ../
rmdir ./data/
注:由于data目录已经是空目录,所以可以直接用rmdir进行删除。另外可以用rm -rf ./data/删除该目录。
8、已知test.txt内容为:
test
liyao
oldboy
请给出输出test.txt文件内容是不包含oldboy字符串的命令。
解答:
方法一:head -2 test.txt
方法二:grep -v oldboy test.txt
方法三:sed -n ‘1,2p’ test.txt
方法四:awk ‘NR < 3 {print $0}’ test.txt
此处用awk ‘NR < 3 {print $1}’ test.txt也可以,因为每行只有一列,所以$0和$1等效。
方法五:sed ‘/oldboy/d’ test.txt
9、请用一条命令创建目录/oldboy/test,即创建/oldboy目录及/oldboy/test目录。
解答:mkdir -p /oldboy/test
10、已知/tmp下已经存在test.txt文件,如何执行命令才能把/mnt/test.txt拷贝到/tmp下覆盖掉/tmp/test.txt,而不让系统提示覆盖(root权限下)
解答:
方法一:/bin/cp /mnt/test.txt /tmp/test.txt
方法二:\cp /mnt/test.txt /tmp/test.txt
方法三:注释掉root用户下.bashrc文件中的cp别名,保存后source ~/.bashrc,再执行cp /mnt/test.txt /tmp/test.txt
注:root用户默认在.bashrc配置文件中对cp,rm等几个命令设置了别名,所以,本题的解题关键是如何将命令别名失效。
11、只查看ett.txt文件(共100行)内第20到30行的内容。
解题:
生成测试文件:seq 100 > ett.txt
方法一:sed -n ‘20,30p’ ett.txt
方法二:head -30 ett.txt | tail -11
方法三:awk ‘NR >=20 && NR <=30 {print $0}’ ett.txt
方法四:grep -C 5 25 ett.txt
方法五:grep -A 10 20 ett.txt
方法六:grep -B 10 30 ett.txt
12、分析图片服务日志,把日志(每个图片访问次数*图片大小的总和)排行,取top10,也就是计算每个url的总访问量大小。
【附加题:工作场景高难度加分题】
说明:本题生产环境应用:这个功能可以用于IDC网站流量带宽很高,然后通过分析服务器日志哪些元素占用流量过大,进而进行优化或裁剪该图片,压缩js等措施。
本题需要输出三个指标:【访问次数】 【访问次数*单个文件大小】 【文件名(可以带(URL)】
测试数据:
59.33.26.105 - - [08/Dec/2010:15:43:56 +0800] "GET /static/images/photos/2.jpg HTTP/1.1" 200 11299 "
http://oldboy.blog.51cto.com/static/web/column/17/index.shtml?courseId=43" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"
59.33.26.105 - - [08/Dec/2010:15:43:56 +0800] "GET /static/images/photos/2.jpg HTTP/1.1" 200 11299 "
http://oldboy.blog.51cto.com/static/web/column/17/index.shtml?courseId=43" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"
59.33.26.105 - - [08/Dec/2010:15:44:02 +0800] "GET /static/flex/vedioLoading.swf HTTP/1.1" 200 3583 "
http://oldboy.blog.51cto.com/static/flex/AdobeVideoPlayer.swf?width=590&height=328&url=/[[DYNAMIC]]/2" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"
124.115.4.18 - - [08/Dec/2010:15:44:15 +0800] "GET /?= HTTP/1.1" 200 46232 "-" "-"
124.115.4.18 - - [08/Dec/2010:15:44:25 +0800] "GET /static/js/web_js.js HTTP/1.1" 200 4460 "-" "-"
124.115.4.18 - - [08/Dec/2010:15:44:25 +0800] "GET /static/js/jquery.lazyload.js HTTP/1.1" 200 1627 "-" "-"
解答:
方法一:awk '{print $7" "$10}' test.log |sort| uniq -c | awk '{print $1" "$2" "$1*$3}' |sort -rk 1|head
方法二:cut -d ' ' -f 7,10 test.log | sort|uniq -c | awk '{print $1" "$2" "$1*$3}' | sort -rk 1|head
注:uniq -c来统计次数,uniq的输入得是排过序的文本或输入,所以,在uniq -c之前得先sort处理输出;sort -rk 1,-r是逆序排序,-k是排序是列值,可以通过-k来控制排序优先级。本题解题关键取出相应的字段,所以,首先得分析日志文件,确定日志文件的规律。如果该日志文件无规律可循,本题用cut,awk来解可能都无法实现。在这还可以使用printf对输出进行美化(格式化输出)。如下:
printf "%-10s %-50s %-s\n" "Visits" "File Name" "Total File Size";awk '{print $7" "$10}' test.log | sort | uniq -c | awk '{printf("%-10s %-50s %-s\n",$1,$2,$1*$3)}' | sort -rk 1 | head
在生产环境实际使用,一般会写成脚本,定期生成报表,定时执行后对比分析;当然,也可以直接从文件中把日期字段截取出来,可以可就时间段进行分析。
13、把/oldboy目录下及其子目录下所有以扩展名.sh结尾的文件中包含./hostlists.txt的字符串全部替换为../idctest_iplist。
解答:
首先生成测试文件:
[root@oldboy oldboy]# for file_name in {1..10}.sh
> do
> echo "$file_name ./hostlists.txt 2222" > $file_name
> done
[root@oldboy oldboy]# ls
10.sh 1.sh 2.sh 3.sh 4.sh 5.sh 6.sh 7.sh 8.sh 9.sh test
[root@oldboy oldboy]# cat 1.sh
1.sh ./hostlists.txt 2222
解题方法:
方法一:
find /oldboy/ -type f -name "*.sh" -exec sed -i 's#./hostlists.txt#../idctest_iplist#g' {} \;
方法二:
find /oldboy/ -type f -name "*.sh" | xargs sed -i 's#./hostlists.txt#../idctest_iplist#g'
方法三:
for file_name in $(find /oldboy -type f -name “*.sh”);do sed -i 's#./hostlists.txt#../idctest_iplist#g' $file_name;done