要写shell肯定要知道shell是什么又能做什么
- 是什么:shell script是利用shell的功能所写的一个程序,这个程序是使用纯文本文件,将一些shell的语法与指令写在里面,然后用正规表示法,管道命令以及数据流重导向等功能,以达到我们所想要的处理目的
- 目的:写shell脚本的目的是为了能有效而便捷的控制和管理用户,以及一些网络和用户情况的纪录;shell脚本比其他语言要简单而易学
链接:shell脚本百度百科
shell脚本的基本知识
一. 正则表达式
这里先要申明正则表达式与bash里面的通配符是不一样的
^word 界定符行首
word& 界定符行尾
. 表一定有一个任意字符
\ 跳脱字符,去除特殊符号的意义
* 重复0到无穷个前一个字符
[list] 任意一个括号内的字符
[n1-n2] 字符范围。可以是[a-z] [A-Z] 与ASCII编码有关
[^list] 括号内的^意思是非
二. shell变量
- 变量的设定与取用
变量表达式:变量名=变量值
name="hello world$?" // " "双引号保留原有特性
ehco $name =>hello world0
name='hello world$0'
echo $name =>hello world$0
- 环境变量
- export name //使变量name变为环境变量
- unset name //取消环境变量的设定
三. shell循环
- while 条件 //当条件成立时进行循环
do
程序段
done - untril 条件 //当条件成立是结束循环
do
程序段
done - for 变量 in con1 con2 con3 //定式循环
do
程序段
done
四. shell判断
- test指令判断
- 判断符 [ ] //[ ]是test的另一种表达方式
name="test"
[ ${name} == "test" ] #注意等号旁边的空格不能省【空格 空格==空格 空格】
- 条件判断
- if条件判断
if[条件判断式一]; then
条件一成立时
else
条件一不成立时
fi //结束
- case esac
case ${name} in
"hello")
echo "Hello World!"
;;
"")
echo "You MUST input ${name} someword"
;;
*)
echo "oh y!"
五. 撷取命令
- cut
cut -d ‘分隔字符’ -f 第几字段
-d :后面接分隔字符。与 -f 一起使用;
-f :依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思;
-c :以字符 (characters) 的单位取出固定字符区间;
echo $PATH |cut -d ':' -f 1-3,5
/bin:/usr/bin:/sbin:/usr/local/bin
- grep
grep [选项] [文件]
参数 作用
-b 将可执行文件当文本文件来搜索
-c 仅显示找到的行数
-i 忽略大小写
-n 显示行号
-v 反向选择 – 仅列出没有关键词的行。v 是 invert 的缩写。
-r 递归搜索文件目录
grep hello helloworld.txt #返回的是helloworld.txt中的一个包含hello的行
shell小程序
问题:统计所给字典在文章中出现的字频
要解决的问题:
- 循环读出文章
- 统计文章中的字频
- 判断是否是所给字典中的词
#!/bin/bash
filename=1.txt
#先用数组统计文本中的字频,数组使用字符串为下表,将统计好的字频重定向入文件sumcount
awk '{for(i=1;i<=NF;i++) count[$i]++} END{for(patten in count) printf("%-20s%d\n",patten,count[patten])}' $filename >> sumcount
#用cut将字典中的单词单独切出,用while循环再read逐行读进LINE变量,判断字典中的字与sumcount中的字频是否有相同相同则输出
cat edited.csv|cut -d "," -f 1 |while read LINE
do
awk -v name=$LINE '{if($1==name)print $0}' sumcount
done