Q1. linux系统 /home目录下有一个文件test.xml,内容如下,
请写出shell脚本删除文件中的注释部分内容,获取文件中所有artifactItem的内容,并用如下格式逐行输出 artifactItem:groupId:artifactId
分析:这个文件比较特殊,但是却很有规律。注释部分内容其实就是中间的内容,所以我们想办法把这些内容删除掉就ok了。而artifactItem的内容,其实就是获取
答案:
#!/bin/bash
egrep -v '' 1.txt |tee 2.txt //这行就是删除掉注释的行
grep -n 'artifactItem>' 2.txt |awk '{print $1}' |sed 's/://' > /tmp/line_number.txt
n=`wc -l /tmp/line_number.txt|awk '{print $1}'`
get_value(){
sed -n "$1,$2"p 2.txt|awk -F '<' '{print $2}'|awk -F '>' '{print $1,$2}' > /tmp/value.txt
nu=`wc -l /tmp/value.txt|awk '{print $1}'`
for i in `seq 1 $nu`
do
x=`sed -n "$i"p /tmp/value.txt|awk '{print $1}'`
y=`sed -n "$i"p /tmp/value.txt|awk '{print $2}'`
echo artifactItem:$x:$y
done
}
n2=$[$n/2]
for j in `seq 1 $n2`
do
m1=$[$j*2-1]
m2=$[$j*2]
nu1=`sed -n "$m1"p /tmp/line_number.txt`
nu2=`sed -n "$m2"p /tmp/line_number.txt`
nu3=$[$nu1+1]
nu4=$[$nu2-1]
get_value $nu3 $nu4
done
Q2. linux系统中,根目录/root/下有一个文件 ip-pwd.ini,内容如下
10.111.11.1,root,xyxyxy
10.111.11.1,root,xzxzxz
10.111.11.1,root,123456
10.111.11.1,root,xxxxxx
……
文件中每一行的格式都为linux服务器的ip root root密码 请用一个shell批量将这些服务器中的所有tomcat进程kill掉
讲解: 有了ip,用户名和密码,剩下的就是登录机器,然后执行命令了。批量登录机器,并执行命令,咱们课程当中有讲过一个expect脚本。所以本题就是需要这个东西来完成。
答案:
首先编辑expect脚本 kill_tomcat.expect
#!/usr/bin/expect
set passwd [lindex $argv 0]
set host [lindex $argv 1]
spawn ssh root@$host
expect {
"yes/no" { send "yes\r"; exp_continue}
"password:" { send "$passwd\r" }
}
expect "]*"
send "killall java\r"
expect "]*"
send "exit\r"
编辑完后需要给这个文件执行权限 chmod a+x kill_tomcat.expect
然后编辑shell脚本
#!/bin/bash
n=`wc -l ip-pwd.ini`
for i in `seq 1 $n`
do
ip=`sed -n "$n"p ip-pwd.ini |awk -F ',' '{print $1}'`
pw=`sed -n "$n"p ip-pwd.ini |awk -F ',' '{print $3}'`
./kill_tomcat.expect $pw $ip
done
Q3. 查看test.txt文件中已aaa结尾的所有行。
答案:grep 'aaa$' test.txt
Q4. 查找当前路径下文件名包含test的所有文件
答案:find ./ -name “*test*”
3. 进入/home/imix目录创建 testing目录 并拷贝testing目录到/tmp下,并删除源目录
答案:
cd /home/imix
mkdir testing
cp -r testing /tmp/
rm -rf /home/imix/testing
4. 输出当前路径下的文件详细信息并以空格分割打印第九个域并过滤包含agent字符串的结果
答案:ls -l |awk ‘{print $9}’ |grep ‘agent’
5. 给test.sh文件可执行权限 给 check.sh文件同组和非同组用户读权限
答案:
chmod a+x test.sh
chown g+r,o+r check.sh
6. 将当前服务器磁盘占用情况以GB的方式显示,并写入/tmp目录下的disk.txt文件
答案:df -h > /tmp/disk.txt
7. 输出当前服务器上的时间信息,格式为 YYYYMMDD-HH:MM:DD
答案:date +%Y%m%d-%H:%M:%S
8. 在当前服务器上查看远程服务器199.31.176.70上1521端口是否开通?
答案:telnet 199.31.176.70 1521
9. 在当前用户创建一个计划任务 每周一到周五凌晨3点执行/home/imix下的app.sh脚本
答案:0 3 * * 1-5 /bin/sh /home/imix/app.sh
10. 请使用条件函数if撰写一个shell函数 函数名为 f_judge,实现以下功能 当/home/log 目录存在时 将/home目录下所有tmp开头的文件或目录移至/home/log 目录。 当/home/log目录不存在时,创建该目录,然后退出。
答案:
#!/bin/bash
f_judge (){
if [ -d /home/log ]
then
mv /home/tmp* /home/log/
else
mkdir -p /home/log
exit
fi
}
统计ip访问情况,要求分析nginx访问日志,找出访问页面数量在前十位的ip
cat access.log | awk '{print $1}' | uniq -c | sort -rn | head -10
使用tcpdump监听主机为192.168.1.1,tcp端口为80的数据,同时将输出结果保存输出到tcpdump.log
tcpdump 'host 192.168.1.1 and port 80' > tcpdump.log
如何将本地80 端口的请求转发到8080 端口,当前主机IP 为192.168.2.1
iptables -A PREROUTING -d 192.168.2.1 -p tcp -m tcp -dport 80 -j DNAT-to-destination 192.168.2.1:8080
实时抓取并显示当前系统中tcp 80端口的网络数据信息,请写出完整操作命令
tcpdump -nn tcp port 80
查看http的并发请求数与其TCP连接状态
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
还有ulimit -n 查看linux系统打开最大的文件描述符,这里默认1024
不修改这里web服务器修改再大也没用,若要用就修改很几个办法,这里说其中一个:
修改/etc/security/limits.conf
soft nofile 10240
hard nofile 10240
重启后生效
用tcpdump嗅探80端口的访问看看谁最高
tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}'| sort | uniq -c | sort -nr |head -20
写一个脚本,实现判断192.168.1.0/24网络里,当前在线的IP有哪些,能ping通则认为在线
#!/bin/bash
for ip in seq 1 255
do
{
ping -c 1 192.168.1.$ip > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo 192.168.1.$ip UP
else
echo 192.168.1.$ip DOWN
fi
}&
done
wait
已知 apache 服务的访问日志按天记录在服务器本地目录/app/logs 下,由于磁盘空间紧张
现在要求只能保留最近 7 天的访问日志!请问如何解决? 请给出解决办法或配置或处理命令
创建文件脚本:
#!/bin/bash
for n in seq 14
do
date -s "11/0$n/14"
touch accesswww(date +%F).log
done
解决方法:
pwd/application/logs
find /application/logs/ -type f -mtime +7 -name "*.log"|xargs rm –f
也可以使用-exec rm -f {} \;进行删除
请执行命令取出 linux 中 eth0 的 IP 地址(请用 cut,有能力者也可分别用 awk,sed 命令答)
cut方法1:
ifconfig eth0|sed -n '2p'|cut -d ":" -f2|cut -d " " -f1
192.168.20.130
awk方法2:
ifconfig eth0|awk 'NR==2'|awk -F ":" '{print $2}'|awk '{print $1}'
192.168.20.130
awk多分隔符方法3:
ifconfig eth0|awk 'NR==2'|awk -F "[: ]+" '{print $4}'
192.168.20.130
sed方法4:
ifconfig eth0|sed -n '/inet addr/p'|sed -r 's#^.ddr:(.)Bc.*$#\1#g'
192.168.20.130
1) 如何向脚本传递参数 ?
./script argument
例子: 显示文件名称脚本
./show.sh file1.txt
cat show.sh
#!/bin/bash echo $1
(LCTT 译注:谢谢某匿名访客的提醒,原题有误,修改之。)
2) 如何在脚本中使用参数 ?
第一个参数 : $1,第二个参数 : $2
例子 : 脚本会复制文件(arg1) 到目标地址(arg2)
./copy.sh file1.txt /tmp/ cat copy.sh #!/bin/bash cp $1 $2
3) 如何计算传递进来的参数 ?
$#
4) 如何在脚本中获取脚本名称 ?
$0
5) 如何检查之前的命令是否运行成功 ?
$?
6) 如何获取文件的最后一行 ?
tail-1
7) 如何获取文件的第一行 ?
head-1
8) 如何获取一个文件每一行的第三个元素 ?
awk'{print $3}'
9) 假如文件中每行第一个元素是 FIND,如何获取第二个元素
awk'{ if ($1 == "FIND") print $2}'
10) 如何调试 bash 脚本
将 -xv
参数加到 #!/bin/bash
后
例子:
#!/bin/bash –xv
11) 举例如何写一个函数 ?
function example {
echo "Hello world!" }
12) 如何向连接两个字符串 ?
V1="Hello"
V2="World" V3=${V1}${V2} echo $V3
输出
HelloWorld
13) 如何进行两个整数相加 ?
V1=1
V2=2 let V3=$V1+$V2 echo $V3
输出
3
据 @kashu 的意见,本题的更佳回答为:
两个整数相加,还有若干种方法实现:
A=5
B=6 echo $(($A+$B)) # 方法 2 echo $[$A+$B] # 方法 3 expr $A + $B # 方法 4 echo $A+$B | bc # 方法 5 awk 'BEGIN{print '"$A"'+'"$B"'}' # 方法 6
14) 如何检查文件系统中是否存在某个文件 ?
if [ -f /var/log/messages ] then echo "File exists" fi
15) 写出 shell 脚本中所有循环语法 ?
for 循环 :
foriin$(ls);do echo item:$i done
while 循环 :
#!/bin/bash
COUNTER=0 while [ $COUNTER -lt 10 ]; do echo The counter is $COUNTER let COUNTER=COUNTER+1 done
until 循环 :
#!/bin/bash
COUNTER=20 until [ $COUNTER -lt 10 ]; do echo COUNTER $COUNTER let COUNTER-=1 done
16) 每个脚本开始的 #!/bin/sh
或 #!/bin/bash
表示什么意思 ?
这一行说明要使用的 shell
。#!/bin/bash
表示脚本使用 /bin/bash
。对于 python 脚本,就是 #!/usr/bin/python
。
17) 如何获取文本文件的第 10 行 ?
head -10 file|tail -1
18) bash 脚本文件的第一个符号是什么
#
19) 命令:[ -z "" ] && echo 0 || echo 1
的输出是什么
0
20) 命令 “export”
有什么用 ?
使变量在子 shell
中可用。
21) 如何在后台运行脚本 ?
在脚本后面添加 “&”
。
据 @kashu 的意见,更好的答案是:
nohup command&
大部分时间我们可能是远程使用Linux,我碰到过由于网络断线使得在后台运行的command &
没了...
22) "chmod 500 script"
做什么 ?
使脚本所有者拥有可执行权限。
23) ">"
做什么 ?
重定向输出流到文件或另一个流。
24) &
和 &&
有什么区别
&
- 希望脚本在后台运行的时候使用它&&
- 当前一个脚本成功完成才执行后面的命令/脚本的时候使用它25) 什么时候要在 [ condition ]
之前使用 “if”
?
当条件满足时需要运行多条命令的时候。
26) 命令: name=John && echo 'My name is $name'
的输出是什么
variable
27) bash shell
脚本中哪个符号用于注释 ?
#
28) 命令: echo ${new:-variable}
的输出是什么
variable
29) '
和 "
引号有什么区别 ?
'
- 当我们不希望把变量转换为值的时候使用它。"
- 会计算所有变量的值并用值代替。30) 如何在脚本文件中重定向标准输出和标准错误流到 log.txt
文件 ?
在脚本文件中添加 "exec >log.txt 2>&1"
命令。
31) 如何只用 echo
命令获取字符串变量的一部分 ?
echo ${variable:x:y} x - 起始位置 y - 长度
例子:
variable="My name is Petras, and I am developer."
echo ${variable:11:6} # 会显示 Petras
32) 如果给定字符串 variable="User:123:321:/home/dir"
,如何只用 echo
命令获取 home_dir
?
echo ${variable#*:*:*:}
或
echo ${variable##*:}
33) 如何从上面的字符串中获取 “User”
?
echo ${variable%:*:*:*}
或
echo ${variable%%:*}
34) 如何使用 awk
列出 UID 小于 100 的用户 ?
awk -F: '$3<100' /etc/passwd
35) 写程序为用户计算主组数目并显示次数和组名
cat /etc/passwd|cut -d: -f4|sort|uniq -c|while read c g do { echo $c; grep :$g: /etc/group|cut -d: -f1;}|xargs -n 2 done
36) 如何在 bash shell
中更改标准的域分隔符为 ":"
?
IFS=":"
37) 如何获取变量长度 ?
${#variable}
38) 如何打印变量的最后 5 个字符 ?
echo ${variable: -5}
39) ${variable:-10}
和 ${variable: -10}
有什么区别?
${variable:-10}
- 如果之前没有给 variable 赋值则输出 10;如果有赋值则输出该变量${variable: -10}
- 输出 variable 的最后 10 个字符40) 如何只用 echo
命令替换字符串的一部分 ?
echo ${variable//pattern/replacement}
41) 哪个命令将命令替换为大写 ?
tr '[:lower:]' '[:upper:]'
42) 如何计算本地用户数目 ?
wc -l /etc/passwd|cut -d" " -f1 或者 cat /etc/passwd|wc -l
43) 不用 wc 命令如何计算字符串中的单词数目 ?
set ${string} echo $#
44) "export $variable"
或 "export variable"
哪个正确 ?
export variable
45) 如何列出第二个字母是 a 或 b 的文件 ?
ls -d ?[ab]*
46) 如何将整数 a 加到 b 并赋值给 c ?
c=$((a+b))
或
c=`expr $a + $b`
或
c=`echo "$a+$b"|bc`
47) 如何去除字符串中的所有空格 ?
echo $string|tr -d " "
48) 重写这个命令,将输出变量转换为复数: item="car"; echo "I like $item"
?
item="car"; echo "I like ${item}s"
49) 写出输出数字 0 到 100 中 3 的倍数(0 3 6 9 …)的命令 ?
for i in {0..100..3}; do echo $i; done
或
for (( i=0; i<=100; i=i+3 )); do echo "Welcome $i times"; done
50) 如何打印传递给脚本的所有参数 ?
echo $*
或
echo $@
51) [ $a == $b ]
和 [ $a -eq $b ]
有什么区别
[ $a == $b ]
- 用于字符串比较[ $a -eq $b ]
- 用于数字比较52) =
和 ==
有什么区别
=
- 用于为变量赋值==
- 用于字符串比较53) 写出测试 $a
是否大于 12 的命令 ?
[ $a -gt 12 ]
54) 写出测试 $b
是否小于等于 12 的命令 ?
[ $b -le 12 ]
55) 如何检查字符串是否以字母 "abc"
开头 ?
[[ $string == abc* ]]
56) [[ $string == abc* ]]
和 [[ $string == "abc*" ]]
有什么区别
[[ $string == abc* ]]
- 检查字符串是否以字母 abc 开头[[ $string == "abc" ]]
- 检查字符串是否完全等于 abc57) 如何列出以 ab
或 xy
开头的用户名 ?
egrep "^ab|^xy" /etc/passwd|cut -d: -f1
58) bash 中 $!
表示什么意思 ?
后台最近执行命令的 PID.
59) $?
表示什么意思 ?
前台最近命令的结束状态。
60) 如何输出当前 shell
的 PID
?
echo $$
61) 如何获取传递给脚本的参数数目 ?
echo $#
(LCTT 译注:和第3题重复了。)
*62) $*
和 $@
有什么区别*
$*
- 以一个字符串形式输出所有传递到脚本的参数$@
- 以 $IFS 为分隔符列出所有传递到脚本中的参数63) 如何在 bash
中定义数组 ?
array=("Hi" "my" "name" "is")
64) 如何打印数组的第一个元素 ?
echo ${array[0]}
65) 如何打印数组的所有元素 ?
echo ${array[@]}
66) 如何输出所有数组索引 ?
echo ${!array[@]}
67) 如何移除数组中索引为 2 的元素 ?
unset array[2]
68) 如何在数组中添加 id 为 333 的元素 ?
array[333]="New_element"
69) shell
脚本如何获取输入的值 ?
a) 通过参数
./script param1 param2
b) 通过 read
命令
read -p "Destination backup Server : " desthost
70) 在脚本中如何使用 "expect"
?
/usr/bin/expect << EOD spawn rsync -ar ${line} ${desthost}:${destpath} expect "*?assword:*" send "${password}\r" expect eof EOD
答:一个Shell脚本是一个文本文件,包含一个或多个命令。作为系统管理员,我们经常需要使用多个命令来完成一项任务,我们可以添加这些所有命令在一个文本文件(Shell脚本)来完成这些日常工作任务。
答:在Linux操作系统,“/bin/bash”是默认登录shell,是在创建用户时分配的。使用chsh命令可以改变默认的shell。示例如下所示:
# chsh-s # chsh linuxtechi -s /bin/sh
答:在shell脚本,我们可以使用两种类型的变量:
系统变量是由系统系统自己创建的。这些变量通常由大写字母组成,可以通过“set”命令查看。
用户变量由系统用户来生成和定义,变量的值可以通过命令“echo $<变量名>
”查看。
答:这里有两个方法来实现:
方法一:
2>&1 (# ls /usr/share/doc > out.txt 2>&1 )
方法二:
&> (# ls /usr/share/doc &> out.txt )
答:基础语法如下:
if [ Condition ] then command1 command2 ….. else if [ condition ] then command1 command2 …. else command1 command2 ….. fi fi
Q:6 shell脚本中“$?”标记的用途是什么? ?
答:在写一个shell脚本时,如果你想要检查前一命令是否执行成功,在if条件中使用“$?”可以来检查前一命令的结束状态。简单的例子如下:
root@localhost:~# ls /usr/bin/shar /usr/bin/shar root@localhost:~# echo $? 0
如果结束状态是0,说明前一个命令执行成功。
root@localhost:~# ls /usr/bin/share ls: cannot access /usr/bin/share: No such file or directory root@localhost:~# echo $? 2
如果结束状态不是0,说明命令执行失败。
答:在if-then中使用测试命令( -gt 等)来比较两个数字,例子如下:
#!/bin/bash x=10 y=20 if [ $x -gt $y ] then echo “x is greater than y” else echo “y is greater than x” fi
Q:8 shell脚本中break命令的作用 ?
答:break命令一个简单的用途是退出执行中的循环。我们可以在while和until循环中使用break命令跳出循环。
答:continue命令不同于break命令,它只跳出当前循环的迭代,而不是整个循环。continue命令很多时候是很有用的,例如错误发生,但我们依然希望继续执行大循环的时候。
答:基础语法如下:
case word in value1) command1 command2 ….. last_command !! value2) command1 command2 …… last_command ;; esac
Q:11 shell脚本中while循环语法 ?
答:如同for循环,while循环只要条件成立就重复它的命令块。不同于for循环,while循环会不断迭代,直到它的条件不为真。基础语法:
while [ test_condition ] do commands… done
Q:12 如何使脚本可执行 ?
答:使用chmod命令来使脚本可执行。例子如下:
# chmod a+x myscript.sh
答:#!/bin/bash是shell脚本的第一行,称为释伴(shebang)行。这里#符号叫做hash,而! 叫做 bang。它的意思是命令通过 /bin/bash 来执行。
答:for循环的基础语法:
for variables in list_of_items do command1 command2 …. last_command done
Q:15 如何调试shell脚本 ?
答:使用'-x'参数(sh -x myscript.sh)可以调试shell脚本。另一个种方法是使用‘-nv'参数( sh -nv myscript.sh)。
答:test命令可以用来比较字符串。测试命令会通过比较字符串中的每一个字符来比较。
答:下面的表列出了Bourne shell为命令行设置的特殊变量。
内建变量 |
解释 |
$0 |
命令行中的脚本名字 |
$1 |
第一个命令行参数 |
$2 |
第二个命令行参数 |
….. |
……. |
$9 |
第九个命令行参数 |
$# |
命令行参数的数量 |
$* |
所有命令行参数,以空格隔开 |
答:test命令可以用来测试文件。基础用法如下表格:
Test |
用法 |
-d 文件名 |
如果文件存在并且是目录,返回true |
-e 文件名 |
如果文件存在,返回true |
-f 文件名 |
如果文件存在并且是普通文件,返回true |
-r 文件名 |
如果文件存在并可读,返回true |
-s 文件名 |
如果文件存在并且不为空,返回true |
-w 文件名 |
如果文件存在并可写,返回true |
-x 文件名 |
如果文件存在并可执行,返回true |
答:注释可以用来描述一个脚本可以做什么和它是如何工作的。每一行注释以#开头。例子如下:
#!/bin/bash # This is a command echo “I am logged in as $USER”
答:read命令可以读取来自终端(使用键盘)的数据。read命令得到用户的输入并置于你给出的变量中。例子如下:
# vi /tmp/test.sh #!/bin/bash echo ‘Please enter your name' read name echo “My Name is $name” # ./test.sh Please enter your name LinuxTechi My Name is LinuxTechi
答:“unset”命令用于取消变量或取消变量赋值。语法如下所示:
# unset
答:有两种方法来执行算术运算:
使用expr
命令(# expr 5 + 2) 2.用一个美元符号和方括号($[ 表达式 ]
)例如:test=$[16 + 4] ; test=$[16 + 4]
答:do-while语句类似于while语句,但检查条件语句之前先执行命令(LCTT 译注:意即至少执行一次。)。下面是用do-while语句的语法
do { statements } while (condition)
答:函数是拥有名字的代码块。当我们定义代码块,我们就可以在我们的脚本调用函数名字,该块就会被执行。示例如下所示:
$ diskusage () { df -h ; }
Q:25 如何在shell脚本中使用BC(bash计算器) ?
答:使用下列格式,在shell脚本中使用bc:
variable=`echo “options; expression” | bc`
原文出处: linuxtechi 译文出处:LCTT
1、用sed修改test.txt的23行test为tset;
sed–i ‘23s/test/tset/g’ test.txt
2、查看/web.log第25行第三列的内容。
sed–n ‘25p’ /web.log | cut –d “ ” –f3
head–n25 /web.log | tail –n1 | cut –d “ ” –f3
awk–F “ ” ‘NR==23{print $3}’ /web.log
3、删除每个临时文件的最初三行。
sed–i ‘1,3d’ /tmp/*.tmp
4、脚本编程:求100内的质数。
#!/bin/bash
i=1
while[ $i -le 100 ];do
ret=1
for(( j=2;j<$i;j++ ));do
if [ $(($i%$j))-eq 0 ];then
ret=0
break
fi
done
if[ $ret -eq 1 ];then
echo-n "$i "
fi
i=$((i+1 ))
done
5、晚上11点到早上8点之间每两个小时查看一次系统日期与时间,写出具体配置命令
echo1 23,1-8/2 * * * root /tmp/walldate.sh >> /etc/crontab
6、编写个shell脚本将当前目录下大于10K的文件转移到/tmp目录下
#!/bin/bash
fileinfo=($(du./*))
length=${#fileinfo[@]}
for((i=0;i<$length;i=$((i+2 ))));do
if[ ${fileinfo[$i]} -le 10 ];then
mv ${fileinfo[$((i+1 ))]} /tmp
fi
done
7、如何将本地80端口的请求转发到8080端口,当前主机IP为192.168.2.1
/sbin/iptables-t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.2.1:8080
/sbin/iptables-t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8080
8、在11月份内,每天的早上6点到12点中,每隔2小时执行一次/usr/bin/httpd.sh 怎么实现
echo"1 6-12/2 * * * root /usr/bin/httpd.sh >> /etc/crontab"
9、在shell环境如何杀死一个进程?
psaux | grep | cut -f? 得到pid
cat/proc/pid
killpid
10、在shell环境如何查找一个文件?
find/ -name abc.txt
11、在shell里如何新建一个文件?
touch~/newfile.txt
12、linux下面的sed和awk的编写
1)如何显示文本file.txt中第二大列大于56789的行?
awk -F "," '{if($2>56789){print $0}}' file.txt
2)显示file.txt的1,3,5,7,10,15行?
sed -n "1p;3p;5p;7p;10p;15p" file.txt
awk 'NR==1||NR==3||NR==5||…||NR=15{print $0}' file.txt
3)将file.txt的制表符,即tab,全部替换成"|"
sed-i "s#\t#\|#g" file.txt
13、把当前目录(包含子目录)下所有后缀为“.sh”的文件后缀变更为“.shell”
#!/bin/bash
str=`find./ -name \*.sh`
fori in $str
do
mv$i ${i%sh}shell
done
14、编写shell实现自动删除50个账号功能,账号名为stud1至stud50
#!/bin/bash
for((i=1;i<=50;i++));do
userdel stud$i
done
15、请用Iptables写出只允许10.1.8.179 访问本服务器的22端口。
/sbin/iptables -A input -p tcp -dport 22 -s 10.1.8.179 -j ACCEPT
/sbin/iptables -A input -p udp -dport 22 -s 10.1.8.179 -j ACCEPT
/sbin/iptables -P input -j DROP
16、在shell中变量的赋值有四种方法,其中,采用name=12的方法称( A )。
A直接赋值 B使用read命令
C使用命令行参数 D使用命令的输出
17、有文件file1
1)查询file1里面空行的所在行号
grep -n ^$ file1
2)查询file1以abc结尾的行
grep abc$ file1
3)打印出file1文件第1到第三行
head -n3 file1
sed "3q" file1
sed -n "1,3p" file1
18、假设有一个脚本scan.sh,里面有1000行代码,并在vim模式下面,请按照如下要求写入对应的指令
1)将shutdown字符串全部替换成reboot
:%s/shutdown/reboot/g
2)清空所有字符
:%d
3)不保存退出
q!
19、1到10数字相加,写出shell脚本
#!/bin/bash
j=0
for((i=1;i<=10;i++));do
j=$[j+i ]
done
echo $j
20、常见shell有哪些?缺省的是哪个?
/bin/sh /bin/bash /bin/ash /bin/bsh /bin/csh /bin/tcsh /sbin/nologin
21、Shell循环语句有哪些?
for while until
22、用SHELL模拟LVS,脚本怎么写
/sbin/iptable -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to192.168.1.11-192.168.1.12
23、找出系统内大于50k,小于100k的文件,并删除它们。
#!/bin/bash
file=`find / -size +50k -size -100k`
for i in $file;do
rm -rf $i
done
24、脚本(如:目录dir1、dir2、dir3下分别有file1、file2、file2,请使用脚本将文件改为dir1_file1、dir2_file2、dir3_file3)
#!/bin/bash
file=`ls dir[123]/file[123]`
for i in $file;do
mv $i ${i%/*}/${i%%/*}_${i##*/}
done
25、将A 、B、C目录下的文件A1、A2、A3文件,改名为AA1、AA2、AA3.使用shell脚本实现。
#!/bin/bash
file=`ls [ABC]/A[123]`
for i in $file;do
mv $i ${i%/*}/A${i#*/}
done
每天晚上 12 点,打包站点目录/var/www/html 备份到/data 目录下(最好每次备份按时间生成不同的备份
cat a.sh
#/bin/bash
cd /var/www/ && /bin/tar zcf /data/html-date +%m-%d%H.tar.gz html/
crontab –e
00 00 * /bin/sh /root/a.sh
将/usr/local/test目录下大于100K 的文件转移到/tmp 目录下。
find /usr/local/test -type f -size +100k -exec mv {} /tmp \;
# iptables -t nat -A PREROUTING -d 192.168.16.1 -p tcp --dport 80 -j DNAT --to 192.168.16.1:8080
或者:
# iptables -t nat -A PREROUTING -i eth0 -d 192.168.16.1 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
这个月内,每天的早上 6 点到 12 点中,每隔 2 小时创建一个test.txt文件,内容为ok,如何实现?
a、crontab -e 进入编辑模式
b、添加以下内容 0 6-12/2 * 4 * /bin/touch test.txt (以4月为例)
c、启动服务 service crontab start;chkconfig crontab on
linux系统中如何获取pid为100的进程所监听的tcp端口,请给出详细命令?
netstat -nlpt |grep 100
root@oldboy oldboy]# sh /server/scripts/oldboy.sh
[root@oldboy oldboy]# ls
coaolvajcq_oldboy.html qnvuxvicni_oldboy.html vioesjmcbu_oldboy.html
gmkhrancxh_oldboy.html tmdjormaxr_oldboy.html wzewnojiwe_oldboy.html
jdxexendbe_oldboy.html ugaywanjlm_oldboy.html xzzruhdzda_oldboy.html
qcawgsrtkp_oldboy.html vfrphtqjpc_oldboy.html
[root@cjy linux-20]# vim 2.sh
#!/bin/bash
WORK_DIR=/oldboy/
create(){
i=1
while (($i<11))
do
cd $WORK_DIR && touch `tr -dc "a-z"
[root@cjy linux-20]# ./2.sh
[root@cjy linux-20]# ls /oldboy/
daijyyadst_oldboy.html mjmcfvvjcq_oldboy.html qmgbrihbco_oldboy.html yrxovjbwlv_oldboy.html
djfhdphvqf_oldboy.html mohijpfehs_oldboy.html xdtspqouln_oldboy.html
gjczumsnfy_oldboy.html nfwzssqtus_oldboy.html yhqruiiota_oldboy.htm
请用至少两种方法实现!
[root@cjy linux-20]# vim 3_1.sh
#!/bin/bash
change_name(){
DIR=/oldboy
FILE=`ls /oldboy`
GIRL=_oldgirl.HTML
for i in $FILE
do
c=`echo $i | cut -c 1-10`
mv $DIR/$c* $DIR/$c$GIRL
done
}
change_name
[root@cjy linux-20]# vim 3_2.sh
#!/bin/bash
change_name(){
DIR=/oldboy
FILE=`ls /oldboy`
GIRL=_oldgirl.HTML
for i in $FILE
do
c=`echo $i | awk -F '_' '{print $1}'`
mv $DIR/$c* $DIR/$c$GIRL
done
}
change_name
[root@cjy linux-20]# ./3_1.sh
[root@cjy linux-20]# ls /oldboy/
daijyyadst_oldgirl.HTML mjmcfvvjcq_oldgirl.HTML qmgbrihbco_oldgirl.HTML yrxovjbwlv_oldgirl.HTML
djfhdphvqf_oldgirl.HTML mohijpfehs_oldgirl.HTML xdtspqouln_oldgirl.HTML
gjczumsnfy_oldgirl.HTML nfwzssqtus_oldgirl.HTML yhqruiiota_oldgirl.HTML
批量创建10个系统帐号oldboy01-oldboy10并设置密码(密码为随机8位字符串)。