Shell脚本
Shell简介
Shell是用户与操作系统之间的桥梁,通过Shell用户尅对Linux操作系统及其内核进行控制
交互式Shell不能满足日常需要,为了把工作和任务通过自动化方式完成,所以应运而生Shell脚本
所以Shell脚本就是把多个Shell命令按照一定的逻辑写入一个文件,这个文件则为Shell脚本
Shell分为多种,常用sh与bash
查看系统安装了哪些Shell:
cat /etc/shells
查看当前使用的Shell
echo $SHELL
切换Shell环境,如果之前安装了zsh
chsh -s /bin/zsh
环境变量:
env与export相同,显示当前用户环境变量,不显示自定义变量
declare与set相同,显示用户环境变量和自定义变量
Find
.:表示当前目录
-name:根据名称查找
find . -name “*.txt”
-user: 根据用户查找
-group:根据用户组查找
-perm: 根据权限查找
-size: 根据文件大小查找 +N 表示大于N的文件 -N表示小于N的文件 N表示等于N的文件
N的单位: c, k, M, G 其中c是字节
-regex: 根据正则表达式匹配查找
-type 查找某一类型的文件,诸如:
b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件
Shell中的文本处理
最简单的就是echo,以下三种都会输出Hello World
echo 'Hello World' echo "Hello World" echo Hello World
带变量的echo
str="Hello World" echo "$str, Hi"
echo中的换行符
普通的\n会被直接输出的,下面就会输出 Hello\nWorld
echo "Hello\nWorld"
我们只需要使用 -e,即可换行
echo -e "Hello\nWorld"
grep命令
grep三兄弟:grep fgrep egrep fgrep=grep -F egrep=grep -E
其中grep和egrep支持正则表达式,grep支持基本正则,egrep包含扩展正则
那么fgrep还活着干嘛,怎么不去死呢?
因为如果我们想匹配正则的符号,比如"^This",那就需要fgrep了,还是做了一点微小的工作:D
最基本的文本搜索
grep juntaran /etc/passwd
-c 选项只输出包含关键字的行数
-n 选项不仅输出该行内容,也输出行号
-A [num] After的缩写 num输出关键字所在行以及后面num行
-B [num] Before的缩写 num输出关键字所在行以及前面num行
-C [num] 包含了-A与-B
-v 反向搜索 除了这行别的都输出
-i 忽略大小写
多文件搜索
-l 搜索包含该关键字的所有文件
juntaran@ALW-VM:~/workspace/shell/testDic$ vim test1.txt juntaran@ALW-VM:~/workspace/shell/testDic$ vim test2.txt juntaran@ALW-VM:~/workspace/shell/testDic$ vim test3.txt juntaran@ALW-VM:~/workspace/shell/testDic$ grep -l -i "this" *.txt
-L 反向搜索,不包含该关键字的所有文件
'^[word]' 以[word]开头的所有文件
juntaran@ALW-VM:~/workspace/shell/testDic$ grep '^This' *
'[word]$' 以[word]结尾的所有文件
juntaran@ALW-VM:~/workspace/shell/testDic$ grep 'second$' *
精准匹配词
因为文本包含This is ***
只想匹配“is”这个词,而如果单纯的搜索会把This也搜索到
juntaran@ALW-VM:~/workspace/shell/testDic$ grep '\<is\>' *.txt
可以看到is标了红而This没有
grep -rn "NotApplicable" ./ --color
sed命令
sed=stream editor,顾名思义“流编辑器”
sed [command] [file]
值得注意的是sed命令不直接修改原文件,如果想修改需要加 -i
command分为了两部分,一部分是范围设定,一部分是动作处理
范围设定:指定行数:'3,5' 第3 4 5行
'5,$' 第5行到最后一行
模式匹配:/^[^dD]/ 表示匹配行首是否是d或D开头
动作处理:d:删除该行
p:打印该行
r:读取指定文件的内容
w:写入指定文件
a:在下面插入新行新内容
删除包含2的行(sed的删除只是在模式空间内执行,不会修改原文件)
sed '/2/d' test.txt
-n 输出匹配行
juntaran@ALW-VM:~/workspace/shell/testDic$ sed -n '/6/p' test.txt 19246
简单应用
juntaran@ALW-VM:~/workspace/shell/testDic$ sed -n '1,2p' test.txt 19248 19247 juntaran@ALW-VM:~/workspace/shell/testDic$ sed -n '2,$p' test.txt 19247 19246
替换字符(依然不会修改原文件)
'/AA/s/BB/CC/g' 匹配带有AA的行,把所有的BB替换为CC
juntaran@ALW-VM:~/workspace/shell/testDic$ sed '/^[tT]/s/h/H/g' test2.txt THis is second
删除每行前两个字符
juntaran@ALW-VM:~/workspace/shell/testDic$ sed 's/..//' test2.txt is is second
Linux大棚里面两个脚本题目
1. 写脚本实现,可以用shell、perl等。在目录/tmp下找到100个以abc开头的文件,然后把这些文件的第一行保存到文件new中。
#!/bin/sh for filename in `find /tmp -type f -name "abc*"|head -n 100` do sed -n '1p' $filename>>new done
2. 写脚本实现,可以用shell、perl等。把文件b中有的,但是文件a中没有的所有行,保存为文件c,并统计c的行数。
#!/usr/bin/perl -w open B,"c" or die "c error.($!)"; my $find=0; my ($myb,$mya); while(){ $find=0; chomp($myb=$_); print "B ",$myb,"\n"; open A,"){ chomp($mya=$_); print "A ",$mya,"\n"; if($mya=~/$myb/){ $find=1; print "FIND!\n"; } } if($find==0){ print C $myb,"\n"; } } close A; close B; close C; $linenum=`cat c|wc -l`; print "c line count:",$linenum;
grep一句话:
grep -v -x a.txt -f b.txt | wc -l
ip.txt,统计出现次数最多的前3个ip极其次数
sort ip.txt | uniq -c | sort -rn | head -n 3
行列操作
删除第一行
sed -i '1d' filename
删除最后一列
awk '{print $NF}' filename
取出某一列
awk '{print $N}' filename
参考自Linux大棚blog 找运维一定要看!
http://roclinux.cn/