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中的换行符

普通的 会被直接输出的,下面就会输出 Hello World

echo "Hello
World"

我们只需要使用 -e,即可换行

echo -e "Hello
World"

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,"
";
    open A,"){
        chomp($mya=$_);
        print "A ",$mya,"
";
        if($mya=~/$myb/){
            $find=1;
            print "FIND!
";
        }
    }
    if($find==0){
        print C $myb,"
";
    }
}
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/

原文地址:https://www.cnblogs.com/Juntaran/p/5789651.html