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]</dev/null
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内容如下
----------------------------------------------------------------------------------------------------------------------------------------------
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<STYLE>A:visited {
TEXT-DECORATION: none
}
A:active {
TEXT-DECORATION: none
}
A:hover {
TEXT-DECORATION: underline overline
由于制作DVDrip的流程较为复杂,需要用到的工具软件也较多,因此事先应该做好准备工作,以免正式开工时手忙脚乱。<FONT
color=#ffffff>&[$[r</FONT><BR>
<FONT
color=#ffffff>©雷傲极酷超级论坛 -- 雷傲极酷超级论坛,最新软件,BT
下载,游戏娱乐,交友聊天,您网上的自由天堂 W </FONT><BR>
1、电脑硬件及工具软件的准备<FONT
color=#ffffff>JNp_O</FONT><BR>
<FONT color=#ffffff>©雷傲极酷超级论坛 --
雷傲极酷超级论坛,最新软件,BT
下载,游戏娱乐,交友聊天,您网上的自由天堂 Y</FONT><BR>
制作DVDrip是一项对电脑配置要求较高的工作,你最好要拥有一颗强力的CPU,以下为建议配置:<FONT
color=#ffffff>J+z</FONT><BR>
<FONT color=#ffffff>©雷傲极酷超级论坛 --
雷傲极酷超级论坛,最新软件,BT
下载,游戏娱乐,交友聊天,您网上的自由天堂 }c</FONT><BR>
现在,只要再加上外挂字幕,一部完整意义上的DVDrip就制成了。<FONT
color=#f3f6fa>Qs,!~B</FONT><BR>
* 开始生成 RMVB
文件。双击图一右下表中的文件项,你可以改变文件的存储位置。然后按下红色的 Encode 按钮,压缩就开始了。 <FONT
color=#f3f6fa>*/cdmX</FONT><BR>
替换掉<FONT至</FONT>这之间的内容
sed -n '1h;1!H;${g;s#<FONT[^<]*</FONT>##g;p;}'
'[^>]' 指定“非 '>'”字符,其后的 '*' 完成该表达式以表示“零或多个非 '>' 字符”。
或者这样也可以:
sed -n ':a;$!{N;ba;};${s#<FONT[^<]*</FONT>##g;p;}' old.html
解析:首先设置标签:a,如果不是最后一行则执行{N;ba;},N是读取一行进来,ba表示返回:a标签重新开始执行。${s#<FONT[^<]*</FONT>##g;p;}表示如果是最后一行则执行{s#<FONT[^<]*</FONT>##g;p;}
参考文档:http://bbs.chinaunix.net/thread-1041058-1-1.html
http://wwdhks.blog.51cto.com/839773/869605 ***sed之G、H、g、h使用
3.处理以下文件内容,将域名取出并进行计数排序,如处理:
http://www.baidu.com/index.html
http://www.baidu.com/1.html
http://post.baidu.com/index.html
http://mp3.baidu.com/index.html
http://www.baidu.com/3.html
http://post.baidu.com/2.html
得到如下结果:
域名的出现的次数 域名
3 www.baidu.com
2 post.baidu.com
1 mp3.baidu.com
可以使用bash/perl/php/c任意一种
3、[root@localhost shell]# cat file | sed -e ' s/http://////' -e ' s///.*//' | sort | uniq -c | sort -rn
3 www.baidu.com
2 post.baidu.com
1 mp3.baidu.com
[root@codfei4 shell]# awk -F/ '{print $3}' file |uniq -c|sort -nr|awk '{print $1"\t"$2}'
3 www.baidu.com
2 post.baidu.com
1 mp3.baidu.com
13.编写个shell脚本将当前目录下大于10K的文件转移到/tmp目录下
方法1:
#!/bin/bash
for file in $(find /tmp/ -size +10k')
do
{
cp $file /data/backup/
}
done
方法2,好强大:
ls -l|cp $(awk '$5>10000 {print $NF}') /data/backup/
ls -l|cp `awk '$5>10000 {print $NF}'` /data/backup/
或者cp $(find /tmp/ -size +10k') /data/backup/
这样就会先执行awk 再执行cp命令,``等效于$()
14.在maillog中查找“Senders by message count",然后将之后的内容都打印出来。
cat /var/log/maillog |sed -n '/Senders by message count/,$p'
2.在当前目录中,把所有后缀名为.txt的文件中的"/sss/ttt"替换为"/aaa/bbb/ccc",用C-shell或TCL或perl编程完成。 #!/bin/bash for file in $(ls *.txt) do sed -i 's#/sss/ttt#/aaa/bbb/ccc#g' $file done 3.使用Perl ,Tcl 或 C实现如下的功能: 从文件mail.list中读取联系人和联系邮箱,并在其中读取@nvidia.com的联系人,按字母表排序并写入nvidia.list。 mail.list文件内容大致类似如下: <name> <Email> James [email protected] Jenny [email protected] Jojo [email protected] Keke [email protected] Lily [email protected] *****,很有难度,现有两个磁盘文件file1 和file 2。file 1有2个字段,分别是A(整数)、B(字符串),字段间以tab分割,共计1千万行,其中A不重复;file 2有2个字段,分别是a(整数)和 d(整数),字段间以tab分割,共计10万行,其中a不重复。需要生成一个新的文件,列出包含所有A=a的情况的B、d两列,tab分隔;对B按ASCII升序排序。请给出如果让你完成本项工作你会采用的工具和具体方式,务必注意实现效率。参考:http://bbs.chinaunix.net/thread-1289370-1-1.html 方法1:awk 'NR==FNR{a[$1]=$2}NR>FNR&&($1 in a){print $2"\t"a[$1]}' file2 file1 | sort 将file2的10w行放到a数组,然后对比1000w次(每次取一行) 方法2:awk 'NR==FNR{a[$1]=$2}NR>FNR&&($1 in a){print a[$1]"\t"$2}' file1 file2 | sort 将file1的1000w行放入a数组,然后对比10w次 对比结果,方法1需要10s,方法需要20s. 参考:http://hi.baidu.com/u200713054/item/bd61e13ea26bb70acfb9fe24 awk中使用NR和FNR的一些例子1、用某一文件的一个域替换另一个文件中的的特定域? 文件b: FS="[ |,]" 表示输入分割域为空格或者, 某知名公司shell笔试题 现有文本文件日志: 统计时长:awk 'NR>1{a[$3]+=$2}END{for (i in a) print i,a[i]}' test.txt 其实和这个原理一样: netstat -na|awk '/^tcp/ {s[$NF]++} END{for (i in s) print i,s[i]}' 文件整理 答案:join employee bonus | sort -k 2 $0 $? $! $$ 就是这个符号看看你能知道这几个系统变量的意义, $0就是该bash文件名 $?是上一指令的返回值 $*所有位置参数的内容:就是调用调用本bash shell的参数。 $@基本上与上面相同。只不过是 “$*”返回的是一个字符串,字符串中存在多外空格。 “$@”返回多个字符串。 15.有一个文件,每行记录了字符串(长度为1-127字节),大约有1亿行,请排出重复次数最高的前1000条。(可以用awk、sed等工具)。 比如问如下: aaa ccc ccc ddd aaa aaa bbb 那么重复次数为: aaa 3次 ccc 2次 ddd 1次 bbb 1次 当然不局限于shell,这只是一个工具而已,关键在与排序算法 方法1: time sort testfile|uniq -c|sort -nr|head -1000 对比:方法2更加高效,特别是当字符重复出现的次数很高的时候,方法1sort1亿行,效率非常低,而方法2,直接把字符出现的次数放到数组,然后print 出来,再sort的时候也许只需要排序1000行记录,这样效率将会大大提高。 公司名称:奇虎360 以下是面试题: 1、写一个脚本查找最后创建时间是3天前,后缀是*.log的文件并删除。 2、写一个脚本将某目录下大于100k的文件移动至/tmp下。 3、写一个脚本将数据库备份并打包至远程服务器192.168.1.1 /backup目录下。 4、写一个防火墙配置脚本,只允许远程主机访问本机的80端口。 5、写一个脚本进行nginx日志统计,得到访问ip最多的前10个(nginx日志路径:/home/logs/nginx/default/access.log)。 6、写出下列命令的含义 (1)MaxKeepAliveRequests 100 (2)Options FollowSymLinks Order Deny Allow Deny from all Allow from 192.168.1.1 7、写一个脚本把指定文件里的/usr/local替换为别的目录。 8、请简单阐述运维工程师的职责。 2、写一个脚本将某目录下大于100k的文件移动至/tmp下。 或者find . -size +100k -exec cp {} /tmp \; 3、写一个脚本将数据库备份并打包至远程服务器192.168.1.1 /backup目录下。 mount 192.168.1.1:/backup /mntcd /mnt /usr/local/mysql/bin/mysqldump -hlocalhost -uroot test >test.sql tar czf test.sql.tar.gz test.sql rm -f test.sql 4、写一个防火墙配置脚本,只允许远程主机访问本机的80端口。 iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT iptables -F iptables -X iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT iptables -P INPUT DROP 5、写一个脚本进行nginx日志统计,得到访问ip最多的前10个(nginx日志路径:/home/logs/nginx/default/access.log awk '{a[$1]++}END{for (j in a) print a[j],j}' /home/logs/nginx/default/access.log|sort -nr|head -10 6.写出下列命令的含义 出现几率比较高的: 企业运维面试题 分享 大家看看自己会多少 ? #!/bin/bash for file in $(find /var/log/ -type f -size -100k); do { cp $file /tmp/ if [ $? -eq 0 ] then echo "ok" else echo "cp $file is failed"|mail -s "Note:cp is failed!" [email protected] fi } done 5、简述智能DNS的工作原理及CDN的作用 ip=`ifconfig eth0|sed -n 2p|awk '{ print $2 }'|awk -F : '{ print $2 }'` port=`netstat -anl|grep 3306 |sed -n '1p' |awk '{print $4}'|awk -F: '{ print $2}'` array=($(mysql -uUSER -pPASSWD -e "show slave status\G"|grep "Running" |awk '{print $2}')) if [ "$port" == "3306" ] else mysqldump -all-databases >allbackupfile.sql 备份数据库 mysql -hhostname -uusername -p databasename < backupfile.sql 还原数据库 mysqldump -hhostname -uusername -ppassword databasename |gzip > backupfile.sql.gz 压缩备份数据库 mysqldump -hhostname -uusername -ppassword databasename specific_table1 specific_table2 >backupfile.sql 备份单个数据库表 |