shell脚本学习-3(百度shell脚本笔试题)
1. 从a.log文件中提取包含"WARNING"或"FATAL",同时不包含"IGNOR"的行,然后提取以":"分割的第5个字段
2. 编写一个脚本,只想简单的减法运算,要求提示输入变量
3. Shell脚本阅读(解释下面执行的功能),请挑出下面程序或脚本中的错误,并说明错在哪里。
#!/bin/bash
#监控cpuser的point端口是否正常
logname="/home/forum/log/lpointlog.wf"
flagfile="/home/forum/log/lognum.txt"
lodnum=sed -n "1,1 p"$flagfile
newnum=wc -l ${logname}
echo $newnum >$flagfile
totalnum=expr $newnum -$oldnum
tail -n $totalnum $logname |grep "POINT_THREAD WARNING"
if [$?==0]
then
mail -s "cpuser point "端口异常,请处理!" [email protected]
fi>
答案:
1.
#!/bin/bash
awk -F: '{if ($0~/(WARNING|FATAL)/ && $0!~/IGNOR/) print $5}' test.txt
或者
awk -F: '$0 ~/WARNING|FATAL/ && $0 !~/IGNOR/ print $5}' test.txt
或者:egrep 'WARNING|FATAL' a.log | grep-v 'IGNOR' | awk -F: '{print $5 }'
错误写法,主要{}的位置:awk -F: 'if ($0~/(WARNING|FATAL)/ && $0!~/IGNOR/) {print $5}' test.txt
2.
#!/bin/bash
read -p "input a num:" num1
read -p "input another num:" num2
result=`expr $num1 - $num2`
#let "result=num1-num2"
#let result=num1-num2
echo $result
错误写法(1)":"符号放到外面了:read -p "input another num": num2
(2)$num1-$num2之前没有空格:result=`expr $num1-$num2`
3.命令行替换用反引号,if [$?==0] 应该写做if [ $?=0 ],用来判断上次命令是否执行成功;
倒数第二行应该是>/dev/null,最后fi后面的>去掉。
6. sed -i '/Root/s/no/yes/g' /etc/ssh/sshd_config sed在这个文里Root的一行,匹配Root一行,将no替换成yes.
7.如何杀掉mysql进程:
ps aux|grep mysql|grep -v grep|awk '{print $2}'|xargs kill -9 (从中了解到awk的用途)
killall -TERM mysqld
kill -9 `cat /usr/local/apache2/logs/httpd.pid` 试试查杀进程PID
9.如何在编写SHELL显示多个信息,用EOF
cat << EOF
+--------------------------------------------------------------+
| === Welcome to Tunoff services === |
+--------------------------------------------------------------+
EOF
15.因为同事要统计一下服务器下面所有的jpg的文件的大小,写了个shell给他来统计.原来用xargs实现,但他一次处理一部分,搞的有多个总和....,下面的命令就能解决啦.
find month_0802/ -name '*.jpg'|xargs ls -l |awk '{print $5}'|awk '{a+=$0} END {print a}'
57264035
37.清除僵死进程。
ps -eal | awk '{ if ($2 == "Z") {print $4}}' | kill -9
或者:ps aux|awk '{if($8=="Z") print $2}'| kill -9
腾讯Linux系统工程师面试题
两个文件,file1,file2,各包含100万个唯一的qq号码,但两个文件中的号码有部分重复
要求:
1、找出file1中有而file2中没有的qq号码
2、找出file2中有而file1中没有的qq号码
3、找出两个文件中都有的号码
1、找出file1中有而file2中没有的qq号码
sort file1> file1_tmp
sort file2>file2_tmp
comm -23 file1_tmp file2_tmp
或者:
sort file1 file2|uniq -d > file3
sort file1 file3|uniq -u
或者:grep -f file1 -v file2
2、找出file2中有而file1中没有的qq号码
sort file1> file1_tmp
sort file2>file2_tmp
comm -13 file1_tmp file2_tmp
或者:
sort file1 file2|uniq -d > file3
sort file2 file3|uniq -u
或者:grep -f file2 -v file1
3、找出两个文件中都有的号码
sort file1 file2|uniq -d
或者sort file1> file1_tmp
sort file2>file2_tmp
comm -12 file1_tmp file2_tmp
或者grep -f file1 file2
2.添加一个新组为class01,然后,添加属于这个组的30个用户,用户名的形式为stdXX,其中,XX从01到30?
3.在每个月的第一天备份并压缩/etc目录下的所有内容,存放在/root/backup 目录里,且文件名为如下形式yymmdd_etc,yy为年,mm 为月,dd为日。shell程序fileback存放在/usr/bin 目录下?
4.用shell 编程,判断一文件是不是字符设备文件,如果是将其拷贝到/dev 目下?
5.某系统管理员需要每天做一定的重复工作,编制一个解决方案:
(1).从下午4:50 删除/abc 目录下的全部子目录和全部文件;
(2).从早上8:00~下午6:00每小时读取/xyz目录下x1 文件中每行第一个域的全部数
据加入到/backup目录下的back01.txt文件内;
(3).每逢周一下午5: 50 将/data 目录下的所有目录和文件归档并压缩为文件
backup.tar.gz;
(4).在下午5:55 将IDE接口的CD-ROM缷载(假设CD-ROM 的设备名为hdc);
(5).在早上8:00 开机后启动。
2. groupadd class01;for((i=1;i<=9;i++));do useradd std0$i -G
class01;done;for((i=10;i<=30;i++));do useradd std$i -Gclass01;done
3.1)编写脚本:fileback.sh
-------------------------
#!/bin/bash
tar-zcf /root/backup/`date +%y%m%d`_etc /etc
-------------------------
2)
cp fileback.sh /usr/bin/
3)使用管理员身份执行:crontab-e
-------------------------
00 02 01 * * /bin/sh /usr/bin/fileback.sh
4. copychar.sh
---------
#!/bin/bash
read -p "Please enter your filename:" FILENAME
if [ -c $FILENAME ]; then
cp $FILENAME /dev
else
echo "The $FILENAME is not c file."
fi
---------
5.使用计划任务来完成:
crontab -e
-----------------------
50 16 * * * /bin/rm -rf/abc/*
00 08-18 * * * /bin/awk '{ print $1 }' /xyz/x1 >> /backup/back01.txt
50 17 * * 01 /bin/tar -zcf /backup/backup.tar.gz /data
55 17 * * * umount/dev/hdc
-----------------------
设定BIOS每日上午08:00开机。
awk方面的题目:
test2.txt中内容如下:
1
2
3
4
5
6
7
8
要求输出结果为:
1, 2, 3, 4
5, 6, 7, 8
awk '{if (NR==1) {printf "%s, ",$0} else if (NR%4==0) {print $0} else {printf "%s, ",$0}}' test.txt
注意printf后面的参数,有一个,+空格
jieyou题目:
test.txt的问题内容如下:
aaa
bbb
aaa
bbb
ccc
aaa
bbb
ddd
如果出现
aaa
bbb
ccc
则替换为
ccc
ccc
ccc
方法1:
#!/bin/sed -nrf
/aaa/{$!N;/aaa\nbbb/{$!N;s/aaa\nbbb\nccc/ccc\nccc\nccc/;P;D};P;D};p
#或者改为 /aaa/{$!N;/aaa\nbbb/{$!N;s/aaa\nbbb\nccc/ccc\nccc\nccc/;P;D};P;D};P;D
test.sed test.txt >> test.txt
解释:$!表示不是最后一行。P:Print up to the first embedded newline of the current pattern space.(就是输出模式空间开头到第一个\n之间的内容)
D:If pattern space contains no newline, start a normal new cycle as if the d command was issued. Otherwise, delete text in the pattern space up to the first newline, and restart cycle with the resultant pattern space, without reading a new line of input.
(是删除模式空间开头到第一个\n(含)之间的内容,并且控制流跳到脚本的第一条语句。这里一定要注意这句话“and restart cycle with the resultant pattern space, without reading a new line of input.”,即它是在不改变当前行号的情况下,从头执行的。)这句话也充分的说明了,为什么很多人不愿意读中文翻译版书籍的原因。:-)
N:Add a newline to the pattern space, then append the next line of input to the pattern space. If there is no more input then sed exits without processing any more commands.
(追加下一个输入行到模板块后面并在二者间嵌入一个新行,意思就是说把下一行记录读到模板块,改变当前行号码例如把2,3,4行合并之后,行号变为2,模板块有可能会出现4行记录。如果没有下一个可处理的行,则退出)
p打印模板块的行。
总体意思:如果找到aaa并且不是最后一行则将下一行读取进来与/aaa\nbbb/对比,如果匹配则将下一行读取进来与/aaa\nbbb\nccc计较,如果不匹配则执行;P;D,即是:打印第一行然后跳到开头重新执行/aaa/{$!N......,$!N;s/aaa\nbbb\nccc/ccc\nccc\nccc/;P;D意思是:如果匹配了,直接打印,否则还是只打印第一行然后跳到开头重新执行。
方法2:参考http://bbs.chinaunix.net/thread-1041058-1-1.html
sed -n '1h;1!H;${g;s#aaa\nbbb\nccc#ccc\nccc\nccc#g;p}' test.txt
1h;1!H
就是把每一行都放到hold space中去,也就是把整个文件都读到了hold space
$当到最后一行的时候,g把hold space的内容放到pattern space中。
完全可以用:a;$!{N;ba;}完成同样的工作。
s#aaa\nbbb\nccc#ccc\nccc\nccc#g; 就是全部替换,然后p打印。
类似的问题:
old.html内容如下
----------------------------------------------------------------------------------------------------------------------------------------------