Shell脚本
1.检查文件是否存在,且不为空
[ -f “input.txt” ]&&[ -s “input.txt” ]&&echo “input.txt exists and contains characters”
总结:
- []即判断语法,不必用if
- 注意[]前后必须有空格,各部分再由空格隔开,命令格式如此,不照做,就报错。
- && || 逻辑运算符可用来代替then else。对于与操作符而言,前为真,则执行后面;对于或操作符而言,前为假,则执行后面
2.文件有200行,打印出第20到第50行
#!/bin/bash i=1 while read line do [ $i -ge 20 ]&&[ $i -le 50 ]&&echo $line i=$(($i+1)) done<input.txt
先设置一个行计数器,再读取文件的每一行,判断行号是不是大于等于20,且小于等于50,是的话就打印出该行
<是逆向管道符
line只是变量,read后也可写其它名字,并非必须这么命名
定义的变量,要想使用,须加上$
3.把文本里的apple替换为Apple
sed -i ‘s/apple/Apple/’ input.txt
sed即stream editor,用户不必打开文件就可直接修改文件,参数-i是让修改直接作用于文件上
‘’是命令区,s表示替换,前为待替换字符串,后为替换字符串,记得最后也要有/
4.有文本以制表符隔开,如下:
David Math 95
Lily English 90
Lily Biology 83
Bob Biology 85
David English 88
Bob Math 87
1)问有多少学生?
cat input.txt|awk ‘{print $1}’|sort -u|wc -l
读入文件,结果给awk,只打印出第一列名字的字符,再进行去重(参数 -u)排序,再交给wc统计有多少行(参数 -l),即学生数量
2)谁英语成绩最好,并由低到高排序
cat input.txt|grep ‘English’|sort -r -k3
读入文件,结果给grep,找出包含English的行,再给sort,逆序排列(参数-r),键是第三列(参数-k3)
3)计算数学平均成绩
cat input.txt|grep ‘Math’|awk ‘{sum+=$NF}END{print sum/NR}’
读入文件,结果给grep,找出包含Math的行,再给awk,取每行最后一列的值,累加求和,全部处理后(END),用成绩之和除以记录数(NR,即number of records)
5.将一台主机上的文件(夹)同步到多台主机上
# -> -lt less than
if [ $# -lt 1 ] then echo no arguments; exit; fi # Get file name # Remember not to add space, like arg1 = $1. It looks like a command to bash arg1=$1 # -> $() to get the command result within parantheses target=$(basename $arg1) echo target=$target # Get file path # -> -P enter the actual folder that is soft-linked dir=$(cd -P $(dirname $arg1); pwd) echo dir=$dir # Get user name user=$(whoami) # loop to sync # (()) -> use double parantheses to include dollar-free expressions for((host=102;host<105;host++)) do echo ------hadoop$host------ rsync -avl $dir/$target $user@hadoop$host:$dir done
总结:
- -lt less than,即小于。
- [] 中括号用于字符串与整数比较。
- 赋值表达式的等号前后不要出现空格,否则会被认为是命令,导致无法执行而报错。
- $()或` ` 用于执行命令并返回结果,当中的变量(如$arg)会被解析。
- (()) 双括号可以执行不加dollar符的表达式。
参考: