– 这是更新的第138个运维基础知识点-
shell 中各个命令的区别01 xargs作用
(1)将前一个命令的标准输出传递给下一个命令,作为它的参数,xargs的默认命令是echo,空格是默认定界符
(2)将多行输入转换为单行
02 使用模式
frontcommand|xargs-optionlatercommand
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’-typef|xargsechobegin
exec一次传递一个参数,即执行:echo begin ./xargs.txt;echo begin ./args.txt
find.-name’*.txt’-typef-execechobegin{}\;
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组!而且每个用户需要设定一个不同的密码!
脚本实现如下:
说明:
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 用户名
说明:
echo -n 不换行输出:$echo -n “123”$echo “456”最终输出 123456而不是123456echo -e 处理特殊字符:\n 换行且光标移至行首
ok,就这么一个简单的脚本,就可以再系统里批量生成账号了。而且密码跟账号的名字一样。这就是for do done语句用法。
02 编写shell脚本
将/usr/local/test目录下大于100k的文件转移到/tmp目录下:
日志格式样例如下:
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、脚本:
05 监控主机的磁盘空间
当使用空间超过90%就通过发mail来发警告:
06 自动ftp上传
192.168.100.5/255.255.255.0
192.168.100.1/255.255.255.0
子网掩码: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 前开机后启动。
prgx文件的内容:
50 16 * * * rm -r /abc/*0 8-18/1 * * * cut -f1 /xyz/x1 >> /backup/bak01.txt50 17 * * * tar zcvf backup.tar.gz /data55 17 * * * umount /dev/hdc(c)超级用户登录,用crontab执行 prgx文件中的内容:root@xxx:#crontab prgx;在每日早晨8:00之前开机后即可自动启动crontab
09 设计一个shell程序
添加一个新组为class1,然后添加属于这个组的30个用户,用户名的形式为stdxx,其中xx从01到30
10 编写shell程序
实现自动删除50个账号的功能。账号名为stud1至stud50。
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/etcbakcroncrontab /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如下:
??往期知识点回顾??
Nginx|实用工具篇|备份篇
流量监控工具篇|Ansible
Ansible Tower
实战运维课程
助力你的运维提升之路
通过课程学习你将:
掌握当下高级系统运维或云计算工程师所要求的主流核心技能
具备开发运维工程师的能力
成为独挡面一面运维专家、资深运维工程师或是高级运维管理岗