原创 shell的输入与输出操作

2010-3-23 16:32 2708 8 8 分类: 工程师职场

shell的输入与输出主要包括:

echo命令

read命令

cat命令

管道

tee命令

标准输入、输出和标准错误

重定向



echo [-e] [-n] string

string : 字符串,可以含 shell 变量、转义符等, 一般用双引号括起来

-e : 让 echo 解释 string 中的转义符

-n : 禁止 echo 输出后输出 NEWLINE(换行)


cat [-n][-b][-t][-e] file1 file2 ...

cat 是一个简单而通用的命令,可以用它来显示文件内容,创建文件,还可以用它来显示控制字符

-n : 显示行号

-b : 显示行号(不含空行)

-t : 显示制表符

-e : 显示行结束符

创建文件:

cat file1 file2 > newfile 合并文件

cat > newfile 输入文本,按 ctrl+d 结束输入


管道

| : 把一个命令的输出传递给另一个命令作为输入。

例:ls –l | grep ^d


tee 命令

把输出的一个副本输送到标准输出,另一个副本拷贝到相应的文件中。

tee [-a] filename

-a : 追加到文件末尾

tee 命令一般与管道结合使用

例:ls | tee list.out


grep:


不会对输入文件进行任何修改或影响

grep家族:grep,egrep,fgrep

形式:

grep [选项] pattern file1 file2 ...


pattern:可以是正则表达式(用单引号括起来)、                             或字符串(加双引号)、或一个单词。

file1 file2 ... :文件名列表,作为 grep 命令的输入;grep 的输入也可以来自标准输入或管道;


可以把匹配模式写入到一个文件中,每行写一个,然后使用 -f 选项,将该匹配模式传递给 grep 命令。

grep -f patternfile file1 file2 ...

常用选项:

-c 只输出匹配的行的总数

-i 不区分大小写

-h 查询多个文件时,不显示文件名

-l 查询多个文件时,只输出包含匹配模式的文件的文件名

-n 显示匹配的行及行号

-v 反向查找,即只显示不包含匹配模式的行

-s 不显示错误信息


例:

1.查询多个文件,可以使用通配符 “ * ”

如:grep "math2" *.txt

grep "12" *

2.反向匹配

ps aux | grep "ssh" | grep –v "grep"

3.匹配空行

grep -n '^$' datafile

grep -v '^$' datafile > datafile2

4.精确匹配单词: \< 和 \>

找出所有包含 以 north 开头 的单词的行

grep '\<north' datafile

找出所有包含 以 west 结尾 的单词的行

grep 'west\>' datafile

找出所有包含 north 单词的行

grep '\<north\>' datafile

5.递归搜索目录中的所有文件:-r

grep -r "north" datafile ~/Teaching/linux/

6.关于某个字符连续出现次数的匹配

grep 'o\{2,\}' helloworld

'o\{2,4\}' , 'o\{2,4\}' , 'lo\{2,4\}'




流编辑器sed

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

sed如何工作的:

sed 逐行处理文件(或输入),并将输出结果发送到屏幕。

即:sed 从输入(可以是文件或其它标准输入)中读取一行,将之拷贝到一个编辑缓冲区,按指定的 sed 编辑命令进行处理,编辑完后将其发送到屏幕上,然后把这行从编辑缓冲区中删除,读取下面一行。重复此过程直到全部处理结束。

sed 只是对文件在内存中的副本进行操作,所以 sed 不会修改输入文件的内容。sed 总是输出到标准输出,可以使用重定向将 sed 的输出保存到文件中。


三种调用方式:

1.在命令行中直接调用

2.将sed命令插入脚本文件,然后调用

3.将sed命令插入到脚本文件,生成sed可执行脚本,在命令行中直接键入脚本名


常见的 sed 编辑命令小结:

p 打印匹配行 s 替换命令

= 显示匹配行的行号 l 显示指定行中所有字符

d 删除匹配的行 r 读文件

a\ 在指定行后面追加文本 w 写文件

i\ 在指定行前面追加文本 n 读取指定行的下面一行

c\ 用新文本替换指定的行 q 退出 sed


在 sed_cmd 中可以使用 shell 变量,此时应使用 双引号。


一些 sed 行命令集:

'/north/p' 打印所有包含 north 的行

'/north/!p' 打印所有不包含 north 的行

's/\.$//g' 删除以句点结尾的行中末尾的句点

's/^ *//g' 删除行首空格(命令中 ^ * 之间有两个空格)

's/ */ /g' 将连续多个空格替换为一个空格

    命令中 */ 前有三个空格,后面是一个空格

'/^$/d’ 删除空行

's/^.//g' 删除每行的第一个字符,同 's/.//'

's/^/%/g' 在每行的最前面添加百分号 %

'3,5s/d/D/' 把第 3 行到第 5 行中每行的 第一个 d 改成 D



awk:

awk 是一种用于处理数据和生成报告的编程语言

awk 可以在命令行中进行一些简单的操作,也可以被写成脚本来处理较大的应用问题

awk 与 grep、sed 结合使用,将使 shell 编程更加容易


awk如何工作的:

awk 逐行扫描输入 ( 可以是文件或管道等 ),按给定的模式查找出匹配的行,然后对这些行执行 awk 命令指定的操作


也有类似的三种使用方式。


awk的执行过程:

① 如果存在 BEGIN ,awk 首先执行它指定的 actions

② awk 从输入中读取一行,称为一条输入记录

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

④ 把当前输入记录依次与每一个 awk_cmd 中 pattern 比较:     如果相匹配,就执行对应的 actions;     如果不匹配,就跳过对应的 actions,直到完成所有的 awk_cmd

⑤ 当一条输入记录处理完毕后,awk 读取输入的下一行,重复上    面的处理过程,直到所有输入全部处理完毕。

⑥ awk 处理完所有的输入后,若存在 END,执行相应的 actions

⑦ 如果输入是文件列表,awk 将按顺序处理列表中的每个文件。


awk 中正则表达式中常用到的元字符有:

^ 只匹配行首 ( 可以看成是行首的标志 )

$ 只匹配行尾 ( 可以看成是行尾的标志 )

* 一个单字符后紧跟 *,匹配 0个或多个此字符

[ ] 匹配 [] 内的任意一个字符 ( [^] 反向匹配 )

\ 用来屏蔽一个元字符的特殊含义

. 匹配任意单个字符

str1|str2 匹配 str1 或 str2

+ 匹配一个或多个前一字符

? 匹配零个或一个前一字符

( ) 字符组

Linux 下使用的 awk 是 gawk




操作由一条或多条语句或者命令组成,语句、命令之间用分号 “ ; ” 隔开。操作中还可以使用流程控制结构的语句

awk 命令:

print 输出列表:打印字符串、变量或表达式,输出列表中各参数之间用逗号隔开;若用空格隔开,打印时各输出之间没有空格

printf ( [格式控制符], 输出列表 ) :格式化打印,语法与 C语言中的 printf 函数类似

next:停止处理当前记录, 开始读取和处理下一条记录

nextfile:强迫 awk 停止处理当前的输入文件而处理输入文件列表中的下一个文件

exit:使 awk 停止执行而跳出。若存在 END 语句,则执行 END 指定的 actions


为了避免碰到 awk 错误,要注意以下事项:

确保整个 awk_script 用单引号括起来

确保 awk_script 内所有引号都成对出现

确保用花括号括起动作语句,用圆括号括起条件语句

如果使用字符串,要保证字符串被双引号括起来 ( 在模式中除外 )


awk 语言学起来可能有些复杂,但使用它来编写一行命令或小脚本并不太难。awk 是 shell 编程的一个重要工具。在shell 命令或编程中,可以使用 awk 强大的文本处理能力




awk打印指定行的前m后n行。

1。

  1. awk 'BEGIN{m=2;n=3;i=1;nr_up=0;nr_down=0;}<br /><br />        {<br /><br />         for(i=1;i<=m;i++)<br /><br />        {<br /><br />                up[i]=up[i+1];<br /><br />        }<br /><br />        up[m+1]=$0;<br /><br />        }<br /><br />        /^4$/{<br /><br />                for(j=1;j<=m;j++)<br /><br />                {<br /><br />                        if(up[j])<br /><br />                                print up[j];<br /><br />                        else<br /><br />                                continue;<br /><br />                }<br /><br />                print $0;<br /><br />                flag=n;<br /><br />                next;<br /><br />            }<br /><br />        {if(flag>0)<br /><br />        {<br /><br />                print $0;<br /><br />                flag --;<br /><br />        }<br /><br />}'






2。

  1. <br /><br />awk 'BEGIN{m=2;n=3;i=1;nr_up=0;nr_down=0;num=0}<br /><br />        NR<=m{<br /><br />         str=str"\n"$0;<br /><br />        }<br /><br />        NR>=m{<br /><br />                        str=substr(str,index(str,"\n")+1)"\n"$0;<br /><br />        }<br /><br /><br /><br />        /^4$/{<br /><br />                print str;<br /><br />                flag=n;<br /><br />                next;<br /><br />            }<br /><br />        {if(flag>0)<br /><br />        {<br /><br />                print $0;<br /><br />                flag --;<br /><br />        }<br /><br />}' <br /><br /><br /><br />




3。

  1. <br /><br />awk 'BEGIN{m=2;n=3;i=1;nr_up=0;nr_down=0;}<br /><br />        {<br /><br />         for(i=1;i<=m;i++)<br /><br />        {<br /><br />                up[i]=up[i+1];<br /><br />        }<br /><br />        up[m+1]=$0;<br /><br />        }<br /><br />        /^4$/{<br /><br />                if(nf_up=0)<br /><br />                        nr_up=NR;<br /><br />                else<br /><br />                {<br /><br />                        if(nr_down!=0)<br /><br />                                nr_up=nr_down;<br /><br />                        nr_down=NR;<br /><br />                }<br /><br />                if(nr_down!=0 && nr_up!=0 && nr_down-nr_up<=m+n)<br /><br />                {<br /><br />                        for(i=1;i<=m+n-(nr_down-nr_up-1);i++)<br /><br />                        {<br /><br />                                delete up[i];<br /><br />                        }<br /><br />                }<br /><br />                for(j=1;j<=m;j++)<br /><br />                {<br /><br />                        if(up[j])<br /><br />                                print up[j];<br /><br />                        else<br /><br />                                continue;<br /><br />                }<br /><br />                print $0;<br /><br />                flag=n;<br /><br />                next;<br /><br />            }<br /><br />        {if(flag>0)<br /><br />        {<br /><br />                print $0;<br /><br />                flag --;<br /><br />        }<br /><br />}'<br /><br />




4。

[code]

awk 'BEGIN{m=2;n=3;i=1;nr_up=0;nr_down=0;num=0}

        NR<=m{

         str=str"\n"$0;

        }

        NR>=m{

                if(num>0)

                {

                        str=str"\n"$0;

                        num--;

                }

                else

                {

                        str=substr(str,index(str,"\n")+1)"\n"$0;

                }

        }



        /^4$/{

                if(nf_up=0)

                        nr_up=NR;

                else

                {

                        if(nr_down!=0)

                                nr_up=nr_down;

                        nr_down=NR;

                }

                if(nr_down!=0 && nr_up!=0 && nr_down-nr_up<=m+n)

                {

                        for(i=1;i<=m+n-(nr_down-nr_up-1);i++)

                        {

                                str=substr(str,index(str,"\n")+1);

                                ++num;

                                if(num>m)

                                {

                                        num--;

                                        break;

                                }

                        }

                }

                print str;

                flag=n;

                next;

            }

        {if(flag>0)

        {

                print $0;

                flag --;

        }

}'

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
8
关闭 站长推荐上一条 /3 下一条