sed && awk工具 及一些经常使用的shell脚本

(一)sed

sed是一个精简的、非交互式的流式编辑器,它在命令行中输入编辑命令和指定文件名称。然后在屏幕上查看输出。

逐行读取文件内容存储在暂时缓冲区中,称为“模式空间”(pattern space)。接着用sed命令处理缓冲区的内容,处理完毕后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断反复,直到文件末尾。原文件爱你的内容并没有改变。

sed '4,$d' test.in # 删除4~最后一行
sed '3q' test.in # 读到指定行之后退出
sed 's/public/PUBLIC/' test.in # 替换public为PUBLIC
sed -n 's/public/PUBLIC/p' test.in #打印匹配行

sed [options] sed_cmd files

-e 连接多个编辑命令

-f 指定sed脚本文件名称

-n 阻止输入行自己主动输出

通常grep也能达到效果。比如统计指定文件里的行数

COUNT=$(cat $FILE | grep -a "keyword" | wc -l)

指定多个命令的三种方法:

1.用分号分隔命令

sed 's/public/PUBLIC/;s/north/NORTH/' test.in

2.每一个命令前放置-e

sed -e 's/public/PUBLIC' -e 's/north/NORTH' test.in

3.使用分行命令功能,在输入单引號后按Enter键就会出现多行提示符(>)

sed '
> s/public/PUBLIC/
> s/northNORTH' test.in

经常使用的定位命令:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

常见的编辑命令:

p: 打印匹配行
sed -n '3,5p' test,in
=: 显示匹配行的行号
sed -n '/north/=' test.in
d: 删除匹配的行
sed -n '/north/d' test.in
a\: 在指定行之后追加一行或者多行文本,并显示加入的新内容。

sed '/north/a\AAA>BBB>CCC' test.in
i\: 在指定行之前插入一行或者多行文本。并显示新内容,同上。

c\: 用新文本替换指定的行,使用格式同上
l : 显示指定行中的全部字符,包含控制字符(非打印字符)
sed -n '/north/l' test.in
s:替换命令。使用格式为
[address] s/old/new/[gpw]
address:假设省略。表示编辑全部的行
g: 全局替换
p: 打印被改动后的行
w fname: 将被替换后的内容写到指定的文件里
sed -n 's/north/NORTH/gp' test.in
sed -n 's/north/NORTH/w data' test.in
sed 's/[0-9][0-9]$/&.5/' datafile
&符号用在替换字符串中时,代表被替换的字符串
r: 读文件,将另外一个文件里的内容附加到指定行后
sed '$r data' test.in
w: 写文件。将指定行写入到另外一个文件里
sed -n '/public/w date2' test.in
n: 将指定行的以下一行读入编辑缓冲区
sed -n '/public/{n;s/north/NORTH/p}' test.in
对指定行同一时候使用多个sed编辑命令时,需用大括号括起来,命令之间用分号;隔开。
q:退出,读取到指定行之后退出sed
sed '3q' test.in

(二)awk

awk能够对列进行处理

简单使用方法:

awk [options] sed_script files

-F 指定输入记录字段的分隔符,默认环境变量IFS的值

-f 从指定文件读取awk_script

-v 为awk设定变量

awk -F:'{print $1}' /etc/passwd
awk -F:'/root{print $1 "|" $3}' /etc/passwd

awk的运行过程:

1. 假设存在BEGIN,awk首先运行他指定的actions

2. awk从输入中读取一行,称为一条消息记录

3. awk将读入的记录切割成数个字段,并将第一个字段放入变量$1中。第二个放入变量$2中,依次类推;$0表示整条记录。字段分隔符能够通过选项-F指定,否则使用缺省的分隔符。

4. 把当前输入记录依次与每个awk_cmd中的pattern比較:

假设相匹配。就运行相应的actions

假设不匹配,就跳过相应的actions,直到完毕全部的awk_cmd

5. 当一条输入记录记录完成后,awk读取输入的下一行,反复上面的处理过程。直到所有输入所有处理完成。

6. awk处理全然部的输入后,若存在END。运行对应的actions

7. 假设输入是文件列表。awk将按顺序处理列表中的每一个文件

awk处理的样例:

ifconfig | awk '/inet addr/{ print $2 }'| awk -F:'{ print $2 }'
ifconfig | awk '/inet addr/{ print $2 }'|awk -F: 'BEGIN { print "begin..."}'{ print $2 } END { print "end..." }'

另外。awk还能够处理复合表达式:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

最后,awk不仅是一个命令。它更是一个编程语言

变量:

1. 内部变量 awk ‘{print NR,$0}‘  #给文件加上行号

2.自己定义变量

函数:

1.内置函数

2.自己定义函数

awk ‘{print sum($1,$2)} function sum(x,y){s=x+y;return s}‘ grade.txt

数组

awk ‘BEGIN {print split("123#456",arr,"#");for(i in arr){print arr[i]}}‘

因为这些比較复杂,本文不再展开介绍。

最后附上几个简单的shell脚本。很多其它的实例在我的Github上。

(1)比較大小

#!/bin/bash

echo "please input the two numbers:"
read a
read b
if (($a==$b));then
    echo "a = b"
elif (($a>$b));then
    echo "a > b"
else
    echo "a < b"
fi

(2)查找文件

#!/bin/bash

echo "Enter a file name :"
read a
if [ -e /home/tach/$a ];then
    echo "the file is exist!"
else
    echo "the file is not exist!"
fi

(3)删除大小为0的文件

#!/bin/bash

for filename in `ls`
do
        a=$(ls -l $filename | awk '{print $5}')
        if ((a==0));then
            rm $filename
        fi
done

(4)查看本机IP地址

#!/bin/bash

ifconfig | grep "inet 地址:" | awk '{print $2}' | sed 's/地址:'//g

(5)IP地址合法性推断

#!/bin/bash

CheckIPAddr()
{
   #IP地址需由三个.分隔且均是数字
   echo $1 | grep "^[0-9]\{1,3\}\.\([0-9]\{1,3\}\.\)\{2\}[0-9]\{1,3\}$" > /dev/null
   if [ $? -ne 0 ];then
       return 1
   fi
   ipaddr=$1
   a=`echo $ipaddr | awk -F. '{print $1}'`
   b=`echo $ipaddr | awk -F. '{print $2}'`
   c=`echo $ipaddr | awk -F. '{print $3}'`
   d=`echo $ipaddr | awk -F. '{print $4}'`
   for num in $a $b $c $d
   do
       if [ $num -gt 255 -o $num -lt 0 ];then
           return 1
       fi
   done
   return 0
}

if [ $# -ne 1 ];then
    echo "Usage :$0 ipaddr."
    exit
else
    CheckIPAddr $1
    ans=$?
    if [ $ans -eq 0 ];then
        echo "legal ip address."
    else
        echo "unlegal ip address."
    fi

fi

(6)其它

#!/bin/bash

#显示当前日期和时间
echo `date +%Y-%m-%d-%H:%M:%S`

#查看哪个IP地址连接的最多
netstat -an | grep ESTABLISHED | awk '{print $5}'|awk -F: '{print $1}' | sort | uniq -c

#awk不排序删除反复行
awk '!x[$0]++' filename
#x仅仅是一个数据參数的名字,是一个map,做指定的逻辑推断。假设逻辑推断成立,则运行指定的命令;不成立,直接跳过这一行

#查看最常使用的10个unix命令
awk '{print $1}' ~/.bash_history | sort | uniq -c | sort -rn | head -n 10
#sort中的-r是降序,_-n是依照数值排序(默认比較字符,10<2)

#逆序查看文件
cat 1.txt | awk '{a[i++]=$0} END {for (j=i-1; j>=0;) print a[j--] }'

#查看第3到6行
awk 'NR >=3 && NR <=6' filename 

#crontab文件的一些演示样例
30 21 * * * /usr/local/etc/rc.d/lighttpd restart #每晚9.30重新启动apache
45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart #每月的1,10,22日的4:45重新启动apache
10 1 * * 6,0  /usr/local/etc/rc.d/lighttpd restart  #每周六、日的1:10重新启动apache
0,30 18-23 * * *  /usr/local/etc/rc.d/lighttpd restart #表示在每天18.00至23.00之间每隔30分钟重新启动apache
* 23-7/1 * * *  /usr/local/etc/rc.d/lighttpd restart #晚上11点到早上7点之间。每隔一小时重新启动apache
时间: 2024-11-08 08:53:27

sed &amp;&amp; awk工具 及一些经常使用的shell脚本的相关文章

Shell脚本学习指南 [ 第三、四章 ] 查找与替换、文本处理工具

摘要:第三章讨论的是编写Shell脚本时经常用到的两个基本操作.第四章总共介绍了约30种处理文本文件的好用工具. 第三章 查找与替换 概括:本章讨论的是编写Shell脚本时经常用到的两个基本操作:文本查找.文本替换. 3.1  查找文本 如需从输入的数据文件中取出特定的文本行,主要的工具为grep程序.POSIX采用三种不同grep变体:grep.egrep.fgrep整合为单个版本,通过不同的选项,分别提供这三种行为模式.who | grep -F root上面使用-F选项,以查找固定字符串r

Shell脚本编程与sed,awk工具的使用--9月15日课程作业

一.shell程序的运行原理 1.脚本 脚本或程序源文件是一种文本文件,将文本文件转换成机器指令有两种转换方式: 编译执行:预处理-->编译-->汇编-->链接:事先完成,结果:二进制程序文件 例如:C, C++ 解释执行:由解释器全程参与运行过程,每次读取一行,运行一行: 例如:  Python:程序控制结构,调用编程库完成程序编写: 库文件:功能模块,在编程中可调用: Bash:调用机器上命令程序文件进行程序编写: 外部命令:各应用程序提供: 2.原理 当shell运行一个程序时,会

grep,sed,awk工具的使用

grep过滤特定的行 1.把包含'halt'的行以及这行下面的两行都打印出来. [[email protected] ~]# cp /etc/passwd /tmp/ [[email protected] ~]# cd /tmp/ [[email protected] tmp]# grep -A2 'halt' passwd halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin uucp:x

shell脚本---grep、awk、sed工具

grep:Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来.grep是一种查找过滤工具,正则表达式在grep中用来查找符合模式的字符串. grep有三种变形: 1.grep:标准grep命令主要讨论此格式. 2.egrep:扩展grep,支持基本及扩展的正则表达式 3.fgrep:快速grep,允许查找字符串而不是一个模式.这里的快速并不是值速度快 格式 grep [options] 主要参数 [options]主要参数: -c:只输出匹配行

详解Shell脚本:sed命令工具 ,awk命令工具

-----------------------------概述----------------------------------- Linux文本处理工具(以下都是命令和工具,而且只是作为展示,不能作为修改动作) grep(过滤,但是不支持正则表达式)egrep(支持正则表达式)sed (行过滤)awk(列过滤) - 正则表达式概念 正则表达式:使用单个字符串来描述.匹配一系列符合某个句法规则的字符串 由普通字符与特殊字符组成,一般用在脚本编程.文本编辑器中,如php.python.she等,

Shell脚本 (四)正则表达式 grep sed awk 工具

正则表达式定义正则表达式,又称正规表达式.常规表达式是使用单个字符串来描述.匹配一系列符合某个句法规则的字符串·正则表达式组成普通字符大小写字母.数字.标点符号及一些其他符号元字符在正则表达式中具有特殊意义的专用字符·基础正则表达式示例查找特定字符利用中括号[]来查找集合字符查找行首^与行尾字符$查找任意一个字符.与重复字符查找连续字符范围{}·基础正则表达式的常见元字符^.$...\..[ ].[^ ].[n1-n2].{n}.{n,}.{n,m}·####查找特定字符####n--表示显示行

sed、awk工具

ed sed意为流编辑器(Stream Editor),在Shell脚本和Makefile中作为过滤器使用非常普遍,也就是把前一个程序的输出引入sed的输入,经过一系列编辑命令转换为另一种格式输出.sed和vi都源于早期UNIX的ed工具,所以很多sed命令和vi的末行命令是相同的. sed命令行的基本格式为 sed option 'script' file1 file2 ... sed option -f scriptfile file1 file2 ... 选项含义: --version  

sed &amp;&amp; awk工具 及一些常用的shell脚本

(一)sed sed是一个精简的.非交互式的流式编辑器,它在命令行中输入编辑命令和指定文件名,然后在屏幕上查看输出. 逐行读取文件内容存储在临时缓冲区中,称为"模式空间"(pattern space),接着用sed命令处理缓冲区的内容,处理完成后,把缓冲区的内容送往屏幕.接着处理下一行,这样不断重复,直到文件末尾.原文件爱你的内容并没有改变. sed '4,$d' test.in # 删除4~最后一行 sed '3q' test.in # 读到指定行之后退出 sed 's/public

鸟哥书籍awk工具学习

awk工具 awk也是一个很好的数据处理工具.相比于sed常常作用于一整行的处理,awk则比较倾向于将一行分成数个字段来处理.因此,awk相当适合处理小型的数据.awk通常的运行模式是这样的: [[email protected] opt]#awk '条件类型1{动作1}条件类型2{动作2}' filename awk后面接两个单引号并加上大括号{}来设置想要对数据进行的处理动作.qwk可以处理后续接的文件,也可以读取来自前个命令的standardoutput.但如前面说的,awk主要是处理每一