【SPOTO思博网络】干货分享!运维基础《shell脚本》解析!
shell 中各个命令的区别 01 xargs作用 (1)将前一个命令的标准输出传递给下一个命令,作为它的参数,xargs的默认命令是echo,空格是默认定界符
(2)将多行输入转换为单行 02 使用模式
front command | xargs -option later command
front command:前一个命令
-option:xargs的选项
later command:后一个命令
一般与管道“|”结合使用
03 xargs常用选项 -n:指定一次处理的参数个数
-d:自定义参数界定符
-p:询问是否运行 later command 参数
-t :表示先打印命令,然后再执行
-i :逐项处理
…更多参数查看man xargs
04 xargs与管道的区别 管道“|” 用来将前一个命令的标准输出传递到下一个命令的标准输入。
xargs 将前一个命令的标准输出传递给下一个命令,作为它的参数。
可见,标准输入与命令参数是不同的。个人理解,命令参数就是直接跟在命令后面的,标准输入可以是键盘,文件等。
所以,管道符 | 所传递给程序的不是简单地在程序名后面输入的参数,它们会被程序内部的读取功能如scanf和gets等接收,而xargs则是将内容作为普通的参数传递给程序,相当于直接跟在命令后面。况且,有些命令是不接受标准输入的,比如kill,rm等命令。
总结:管道符后不加xargs相当于先将xargs后面的命令回车执行一下再从键盘里输入管道符前面命令执行的结果内容
加上xargs 相当于执行命令(xargs后面的命令)后,直接从键盘输入管道符前面命令执行的结果内容再回车,即管道前面的结果直接跟在xargs 后面的命令后面
再总结一下,就是回车的先后顺序不太一样。
05 xargs与-exec的区别 -exec:{}表示命令的参数即为所找到的文件,以;表示comman命令的结束。\是转义符,因为分号在命令中还有它用途,所以就用一个\来限定表示这是一个分号而不是表示其它意思。
-ok:和 -exec 的作用相同,格式也一样,只不过以一种更为安全的模式来执行该参数所给出的shell给出的这个命令之前,都会给出提示,让用户来确定是否执行。
xargs将参数一次传给echo,即执行:echo begin ./xargs.txt ./args.txt
find . -name '*.txt' -type f | xargs echo begin
exec一次传递一个参数,即执行:echo begin ./xargs.txt;echo begin ./args.txt
find . -name '*.txt' -type f -exec echo begin {} \;
xargs 要结合管道来完成
格式:find [option] express |xargs command
很明显,exec是对每个找到的文件执行一次命令,除非这单个的文件名超过了几k,否则不会出现命令行超长出报错的问题。
而xargs是把所有找到的文件名一股脑的转给命令。当文件很多时,这些文件名组合成的命令行参数很容易超长,导致命令出错。
另外, find | xargs 这种组合在处理有空格字符的文件名时也会出错,因为这时执行的命令已经不知道哪些是分割符、哪些是文件名中的空格!而用exec则不会有这个问题。
总结
相比之下,也不难看出各自的缺点。
(1)exec 每处理一个文件或者目录,它都需要启动一次命令,效率不好;
(2)exec 格式麻烦,必须用 {} 做文件的代位符,必须用 \; 作为命令的结束符,书写不便。
(3)xargs 不能操作文件名有空格的文件;
(4)exec参数是一个一个传递的,传递一个参数执行一次命令;xargs一次将参数传给命令,可以使用-n控制参数个数。
(5)exec文件名有空格等特殊字符也能处理;xargs不能处理特殊文件名,如果想处理特殊文件名需要特殊处理
综上,如果要使用的命令支持一次处理多个文件,并且也知道这些文件里没有带空格的文件,那么使用 xargs比较方便; 否则,就要用 exec了。
常用shell脚本实例
01 用shell脚本批量建立Linux用户
实现要求:创建用户student1到student50,指定组为student组!而且每个用户需要设定一个不同的密码!
脚本实现如下:
file:///C:/Users/86152/AppData/Local/Temp/ksohtml/wpsFEC7.tmp.jpg
说明
Linux下 Passwd有参数--stdin This option is used to indicate that passwd should read the new password from standard input, which can be a pipe.
所以linux下自动改变用户密码的办法就是:Echo 密码 |passwd –stdin 用户名
file:///C:/Users/86152/AppData/Local/Temp/ksohtml/wpsFEE7.tmp.jpg
说明:
echo -n 不换行输出:
$echo -n "123"
$echo "456"
最终输出 123456
而不是
123
456
echo -e 处理特殊字符: \n 换行且光标移至行首
ok,就这么一个简单的脚本,就可以再系统里批量生成账号了。而且密码跟账号的名字一样。
这就是for do done语句用法。
02 编写shell脚本
将/usr/local/test目录下大于100k的文件转移到/tmp目录下:
file:///C:/Users/86152/AppData/Local/Temp/ksohtml/wpsFF08.tmp.jpg
03 通过apache访问日志access.log 统计IP和每个地址访问的次数,按访问量列出前10名。
日志格式样例如下:
192.168.1.247 ---【02/jul/2010:23:44:59 + 8080 】 "GET /HTTP/1/1" 200 19
答案:
cat access.log | awk '{print $1}' |sort| uniq -c |sort -rn |head -10(uniq 参数说明:– c 显示输出中,在每行行首加上本行在文件中连续出现的次数。
sort参数说明:sort默认的排序方式是升序,-r 参数就会改变成倒叙;你有没有遇到过10比2小的情况。我反正遇到过。出现这种情况是由于排序程序将这些数字按字符来排序了,排序程序会先比较1和2,显然1小,所以就将10放在2前面喽。这也是sort的一贯作风。)
04 一台监控主机,一台被监控主机
被监控主机分区使用率大于80%,就发告警邮件。放到crontab里面,每10分钟执行一次。
a、 首先两台机器要建立服务器间的信任关系。
b、脚本:
file:///C:/Users/86152/AppData/Local/Temp/ksohtml/wpsFF37.tmp.jpg
05 监控主机的磁盘空间
当使用空间超过90%就通过发mail来发警告:
file:///C:/Users/86152/AppData/Local/Temp/ksohtml/wpsFF58.tmp.jpg
06 自动ftp上传
file:///C:/Users/86152/AppData/Local/Temp/ksohtml/wpsFF97.tmp.jpg
07 编写shell脚本,获取本机的网络地址。
比如:本机的ip地址是:
192.168.100.5/255.255.255.0
那么他的网络地址是:
192.168.100.1/255.255.255.0
file:///C:/Users/86152/AppData/Local/Temp/ksohtml/wpsFFD7.tmp.jpg
IP地址也可这样获取:IP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "
子网掩码:NETMASK= `ifconfig eth0 | grep "inet addr"|cut -f 4 -d ":"
08 某系统管理员需要每天做一定的重复工作,编制一个解决方案:
(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 前开机后启动。
用vi创建编辑一个名为prgx的crontab文件;
prgx文件的内容:
50 16 * * * rm -r /abc/*
0 8-18/1 * * * cut -f1 /xyz/x1 >> /backup/bak01.txt
50 17 * * * tar zcvf backup.tar.gz /data
55 17 * * * umount /dev/hdc
(c)超级用户登录,用crontab执行 prgx文件中的内容:
root@xxx:#crontab prgx;在每日早晨8:00之前开机后即可自动启动crontab
09 设计一个shell程序 添加一个新组为class1,然后添加属于这个组的30个用户,用户名的形式为stdxx,其中xx从01到30
file:///C:/Users/86152/AppData/Local/Temp/ksohtml/wps26.tmp.jpg
10 编写shell程序
实现自动删除50个账号的功能。账号名为stud1至stud50。
file:///C:/Users/86152/AppData/Local/Temp/ksohtml/wps65.tmp.jpg
11 设计一个shell程序
在每月第一天备份并压缩/etc目录的所有内容,存放在/root/bak目录里,且文件名为如下形式yymmdd_etc,yy为年,mm为月,dd为日。Shell程序fileback存放在/usr/bin目录下。
参考答案:
(1)编写shell程序fileback:
(2)编写任务定时器:
echo "0 0 1 * * /bin/sh /usr/bin/fileback" >; /root/etcbakcron
crontab /root/etcbakcron
或使用crontab -e 命令添加定时任务:
0 1 * * * /bin/sh /usr/bin/fileback
12 有一普通用户想在每周日凌晨零点零分定期备份/user/backup到/tmp目录下,该用户应如何做?
参考答案: (1)第一种方法
用户应使用crontab –e 命令创建crontab文件。格式如下:
0 0 * * sun cp –r /user/backup /tmp
(2)第二种方法
用户先在自己目录下新建文件file,文件内容如下:
0 * * sun cp –r /user/backup /tmp
然后执行 crontab file 使生效。
13 设计一个Shell程序
在/userdata目录下建立50个目录,即user1~user50,并设置每个目录的权限,其中其他用户的权限为:读;文件所有者的权限为:读、写、执行;文件所有者所在组的权限为:读、执行。
参考答案:
建立程序 Pro16如下:
|| 备考不用慌,大佬带你飞 : 每三位IE,有两位来自思博 进入全国网络工程师交流群 ,请扫描下方二维码↓↓↓
群里有行业大咖、实战分享、技术交流、技术咨询、企业内推等机会
若群满,请添加老杨微信,邀你进群 【推荐阅读】
|