shell 常用的命令

 

查询文件的行数

wc命令

        基本语法:   wc [-option] file

        列出指定文件中的行数、字数及字节数。  

        -l  只计算行数   -w 只计算字数   -c 只计算字节数

字符替换

tr命令

    语法:  tr ‘set1’ ‘set2’

        在这里set1中的所有字符都被转化为set2中的字符。

        注意字符[和]在tr中要用反斜杠\转换,才能被正确处理。

        e.g.        tr ‘!?”:;\[\]{}(),.\t\n’ ‘ ‘ <ch15.doc

                将ch15.doc中的!?”:;[]{}(),. TAB 回车转换为空格。

        e.g.        tr ‘A-Z’ ‘a-z’<ch15.doc

                将ch15.doc中的大写字母转换为小写字母

        e.g.        tr ‘!?”:;\[\]{}(),.\t\n’ ‘ ‘ <ch15.doc|tr ‘ ‘ ‘\n’

                将ch15.doc中的!?”:;[]{}(),. TAB 回车转换为空格,在将空格转换为新的行

 

        有的版本的shell需要set1的字符数和set2的字符数相当

    压缩相同的字符为一个字符

        语法:  tr –s ‘set1’

            当tr遇到set1中多个连续相同的字符时,替换他们为一个字符。

                e.g.        echo “feed me”|tr –s ‘e’            输出为 fed me

    在tr中使用字符类

        语法:  tr ‘[:classname:]’ ‘set2’

        classname是下表所给出的类的名字。set2是你希望用来转义的字符。

描述

alnum

字母和数字

alpha

字母

blank

空格(水平的)

cntrl

控制字符

digit

数字

graph

可印刷字符,不包括空格

lower

小写字母

print

可印刷字符,包括空格

punct

标点符号

space

空格(水平和垂直的)

upper

大写字母

xdigit

十六进制数字

            e.g.        tr ‘[:punct:]’ ‘ ‘<ch15.doc      将ch15.doc中的标点符号换为空格。

            e.g.        tr ‘[:upper:]’ ‘[:lower:]’<ch5.doc   将ch15.doc中的大写转换为小写

重复出现的命令

uniq命令

    语法:  uniq [OPITON] [INPUT [OUTPUT]]

            从一个已经sorted的文件中移除重复的行只保留一行。

            -c 打印字符重复出现的次数。

            -u 只列出沒有重複的列

            -d 只列出有重複的列

文件字符排序

sort命令

    语法:  sort [OPTION] [FILE]

按指定的顺序配序一个或多个文件。当sort命令处理多个文件时,在排序前sort命令先按某种规则把他们合并起来。

        -A      按ASCII码顺序排序

        -c      检查指定文件是否已经按指定的关键字和顺序排序。

-d      按字典顺序排序

        -f      在排序前把所有字母换成大写

        -i      比较时忽略不可显示字符

        -m      合并与排序文件  

        -n      按数值排序

        -ofile  把输出重定向到指定文件

        -r      按指定顺序的逆序排序。

        -u      排序后多个相同的行只输出一行。

+POS1 [-POS2]   start a key at POS1, end it *before* POS2 (obsolescent) field numbers and character offsets are numbered starting with zero (contrast with the -k option)

按POS1到POS2前的几栏排序(从0开始计数)

                e.g.        +3-5            表示按照第3、4两栏排序

        -t SEP 使用SEP指定的字符为栏位的分隔符号

                e.g.        -t ':'      把 ':' 視為欄位的分隔符號

 

 

 

 

 

应用:

列出ch15.doc10个重复次数最多的单词列表

        e.g.        tr ‘[:punct:]’ ‘ ‘<ch15.doc|tr ‘[:space:]’ ‘ ‘|tr ‘A-Z’ ‘a-z’|tr –s ‘ ‘|tr ‘ ‘ ‘\n|sort|uniq –c|sort –rn|head

    打印出/etc/passwd中每个用户和他们的home目录

        e.g.        cut -d':' -f 1,6 /etc/passwd   

    DOS/Windows傳上來的檔案後面的 ^M 去掉 (把結果印在螢幕上)

        e.g.        tr -d '\r' < config.sys

    把所有英文字母變成小寫 (把結果印在螢幕上)
        e.g.        tr 'A-Z' 'a-z' < config.sys

    看看目前目錄下那些檔案占用的空間最多

        ls -l | sort -n +4

看看整個系統內那些程序吃記憶體吃得最兇

ps aux | sort -n +3

看看自己家裡面所有最上層的子目錄各用了多少空間

du -s `ls -l ~ | grep '^d' | cut -c 55-`

把使用者 ckhung所有正在執行的程序全部中斷掉

kill `ps aux | grep '^ckhung' | cut -c 9-16`

看看有那些使用者有程序在執行 (無論有無控制臺)

ps aux | cut -c 1-8 | sort | uniq

abc目錄下(含子目錄,孫目錄, ...)尋找所有內含pqr字串的檔案,並把這些pqr都改成xyz:

grep -l pqr `find abc -type f` > ttt; perl -i -pe 's/pqr/xyz' `cat ttt`

把目前目錄下所有最近三天內修改過的檔案按照大小排出來:

ls -l `find . -type f -mtime -3` | sort -n +4

把目前目錄底下所有 dos格式文字檔, 轉成 unix格式:

file `find . -type ` | grep -i text | sed 's/: .*//' > /tmp/listing; perl -i -pe 's/\015//' `cat /tmp/listing`

正则表达式

1.1.        构成正则表达式的基本元素

1.1.1.       普通字符:包括大小写字母、数字、空格、下划线

1.1.2.       元字符:是在正则表达式中有特殊含义的字符。如下:

元字符 .                       可代替除换行符之外的任何单个字符

元字符 *         可代替零个或多个在它前面出现的字符或正则表达式。*总是匹配尽可能长的字符串

元字符[chars]         可代替chars中的任何一个字符,chars是一串字符序列。你可以用- 字符号来定义一个字符范围。如果^chars中的第一个字符,那么将匹配没有在chars中指定的字符。

元字符 ^                      匹配一行的开头(必须把^作为正则表达式的第一个字符)

元字符 $                       匹配一行的结尾(必须把$作为正则表达式的最后一个字符)

元字符 \                       \后面的字符照常输出,通常用来转义(不用特殊含义)一个元字符

元字符 \{n1,n2}        匹配前面字符或正则表达式的最少n1次最多n2次出现。

元字符 \(\)            保存括号中的正则表达式以备后用。以后可以用\1\9表示前面保存的正则表达式

元字符 \<              在一个字的开始匹配其后的正则表达式

元字符 \>       在一个字的结尾匹配其前的正则表达式

元字符?       匹配其前正则表达式的0次或1次出现

元字符 + 匹配其前正则表达式的1次或多次出现

1.1.2.1.      举例

e.g.    /peach/          精确匹配字符串peach,所有包含字符串peach的行都会被选择。

e.g.    /a.c/        匹配a+ca-cabcmatcha3c之类的字符串的行

e.g.         /a*a/              匹配a+ca-cabcmatcha3caceyaccarctic这样的字符串的行,他还可匹配这样的行:close the window。虽然a并没有出  现,但因为*,它匹配查找零个或多个在它前面出现的字符。

* 总是匹配尽可能长的字符串。

e.g.    /ch.*doc/ 匹配字符串ch01.docch02.docchdoc之类的字符串。

e.g.    /[tT]he/         匹配Thethe

e.g.    /[^T]/            匹配除T之外的所有字符

e.g.         /ch0[0-9]*doc/       匹配ch01.docch02.doc之类的字符串,但是不匹配chdocchangedoc之类的字符串。

e.g.         /^the/            匹配以the开头的行

e.g.         /friend$/         匹配以friend结尾的行

e.g.         /\t\)..\1/         匹配testtaat t, ttbbt之类的串。 \1在这里代替了t

 

1.1.3.       一些有用的正则表达式

匹配空白行                                  /^$/              或者 /^ *$/

匹配一整行                                  /^.*$/

匹配某字符后的所有字符         /(.*$/                   匹配(后的所有字符

匹配某字符前的所有字符         /^.*.)/                  匹配)前的所有字符

匹配一个或多个空格               /*/

匹配HTML(XML)标记集              /<[^>][^>]*>/    

匹配有效的URL                            /[a-zA-Z][a-zA-Z]*:w[a-zA-Z0-9][a-zA-Z0-9\.]*.*/

匹配格式化的美元数               /\$[0-9]*\.[0-9][0-9]/

 

 

 

 

 

 

sed命令

sed是一种对它的输入的每一行进行一系列操作的流式编辑器

1.1.4.       sed的语法:

    sed ‘/pattern/ action’ files

这里files是一个或多个文件的列表。pattern是一个正则表达式,action是下表中说给出的命令

操作

描述

p

打印行

d

删除行

s

用一个表达式置换另外一个

1.1.4.1.      打印行

sed /pattern/p files

默认情况下p打印行时,sed会把每一个输入行打印到输出,在将处理结果打印到输出。所以选中的行会被打印2次,没有被选中的行会被打印1次。为了避免这种情况可以指定n选项

e.g.           sed n/0\.[0-9][0-9]$/pfruit_prices.txt

1.1.4.2.      删除行

sed /pattern/dfiles

1.1.4.3.      执行替换

sed /pattern1/s/pattern2/pattern3/files

使匹配规则pattern1的每一行中的pattern2被替换为pattern3。如果pattern1被忽略,命令s将会对每一行输入都执行。

默认情况下,s命令在一行只执行一次替换。为了执行多次替换,需要用到g(g全局)操作符

/pattern1/s/pattern2/pattern3/g

pattern3位置可使用&操作表示拷贝字符串pattern2

e.g. fruit_prices.txt 中内容为  Banana       0.89              

执行命令           sed s/ *[0-9][0-9]*\.[0-9][0-9]$/\$&/ fruit_prices.txt,就变为 Banana    $0.89

问题???:在 / *[0-9][0-9]*\.[0-9][0-9]$/\$&/中第一个*前必须打个空格,不知道为什么?

1.1.4.4.      -e 参数连续执行多个操作

        e.g.       id|sed –e ‘s/(.*$//’ –e ‘s/^uid=//’

2.         十七、用awk过滤文本

2.1.        awk基本语法:      

awk /pattern/ {actions} files

在这里,files是一个或多个文件的列表,pattern是一个正则表达式,actions是可以使用的命令。

2.2.        字段编辑

awk自动把每行的输入分成字段。默认的字段分隔符是制表符和空格。awk用字段操作符$来访问一个字段的值。例如,$0代表整行,第一个字段是$1,第二个字段是$2,以此类推。

            e.g.        awk ‘{print $1 $3;}’fruit_price.txt           打印每行的第1、3个字段

2.3.        awk使用比较操作符

2.3.1.       awk使用比较操作符的语法:

awk expression {actions} files

这里expression是由下表给出的比较操作符构成:

操作符

描述

小于

大于

<=

小于等于

>=

大于等于

==

等于

!=

不等于

value~/pattern/

如果value匹配样式,则为真

value!~/pattern/

如果value不匹配样式,则为真

e.g.             #!/bin/sh

                            awk 

                                   $3 <= 75 {printf%s\t%s\n,$0,REORDER;}

                                   $3 > 75   {printf $0;}

                                fruit_prices.txt

                     输出第3个字段包括一个小于或者等于75的值的行并加上REORDER字符串。

                     输出第3个字段包含一个大于75的值的行。

2.3.2.       混合表达式

与的语法:                    (expr1) && (expr2)

或的语法:                    (expr1) || (expr2)

e.g.             #!/bin/sh

                     awk 

                             ($2 ~ /^\$[1-9][0-9]*\.[0-9][0-9]$/) && ($3 < 75) {

                           print %s\t%s\t%s\n,$0,*,REORDER;

}

                     fruit_prices.txt

2.3.3.                     next 命令

            next 命令告诉awk跳过所有保留的样式匹配和表达式,并读取下一行,重新开始进行样式匹配。

    e.g.        #!/bin/sh

            awk ‘

                $3 <= 75 {printf “%s\t%s\n”,$0,”REORDER”;next;}

                $3 > 75 {printf $0;}

            ‘  fruit_prices.txt

2.3.4.              使用标准输入作为输入:

            e.g.        ls –l | awk ‘$1 !~ /total/ {printf “%-32s %s\n”,$9,$5;}’           

   

2.4.        awk功能:变量及数值表达式的使用

2.4.1.              定义变量的语法:

        name=value

这里name是变量名,value是变量的值。

初始化变量是没有必要的,当你第一次使用时它会自动初始化。

            变量名只能包含字母、数字和下划线,变量不能以数字开头。

            你可以在同一脚本中把数字和字符串赋值给变量。

                e.g.        fruit=”peach”;fruit=100;

                e.g.        fruit=”peach”;fruity=fruit;

                e.g.        fruit=$1;

2.4.2.                     使用数字表达式

            语法:  num1 operator num2

这里num1和num2是常数或者是变量名。如果变量是字符串而不是数字,则awk使用值为0而不是字符串。operator是如下表的数值操作符。

操作符

+

-

*

/

%

^

描述

取模(余)

求幂

                    e.g.            awk ‘/^ *$/ {x=x+1;print x;}’ t.txt

            赋值操作符语法:     name operator num

                这里nmae是变量名,num是变量的名字或常数,operator是如下表指定的操作符之一。

操作符 

+=

-=

*=

/=

%=

^=

描述

取模(余)

求幂

                    e.g.            awk ‘/^ *$/ {x+=1;print x;}’ t.txt

2.4.3.                     特殊的样式匹配: BEGINEND

            语法:      awk ‘

                            BEGIN { actions }

                            /pattern/ { actions }

                            /pattern/ { actions }

                            END { actions }

                        ‘ files

                祥见 《精通shell编程》p200

2.4.4.                     awk中的内部变量:

           

变量

描述

FILENAME

当前输入文件的名称。不能改变这个变量的值。

NR

当前输入文件的行数或者输入文件的纪录。不能改变这个变量的值。

NF

当前行或者记录的字段数。不能改变这个变量的值。

OFS

输出字段的分隔符(默认是空格)

FS

输入字段的分隔符(默认是空格和制表符,即\t)

OFMT

数字的输出格式(默认是%.6g)

ORS

输出记录分隔符(默认是新起一行)

RS

输入记录分隔符(默认是新起一行)

2.4.5.                     应用:改变输入字段分隔符。

                方法1:在BEGIN中手工重置FS

                        e.g.        awk ‘BEGIN { FS=”:”;} {print $1,$6;}’ /etc/passwd

                方法2:给awk 指定 –F选项可以指定分隔符

                        e.g.        awk –F : ‘{print $1,$6;}’ /etc/passwd

2.4.6.                     awk使用shell变量

            许多版本awk不可直接访问shell变量。必须转换为awk变量。

            语法:  awk ‘script’ awkvar1=value awkvar2=value … files

                这里script 是你想执行的awk脚本。变量awkvar1等等是你想设置的awk变量名称。

                e.g.        awk ‘$3 <= numfruit {print;}’ numfruit=”$NUMFRUIT” fruit.txt

   

2.5.        awk功能:流程控制

        在awk中有3种主要形式的流程控制:if语句、while语句、for语句。

2.5.1.                     if语句的基本语法:

                if (expr1) {

                    action1

                } else if (expr2) {

                    action2

                } else {

                    action3

                }

这里expr1和expr2是用条件操作符建立的表达式,expr1和expr2外面的圆括号是必需的。action1等可以是任何有效的awk命令序列。当一个操作包含一个或多个语句时,涵括这些actions的大括号是必须的。这里对else if语句的数量没有限制。

            e.g.        awk ‘{

                        printf “%s\t”,$0;

                        if ($2~/\$[1-9][0-9]*\.[0-9][0-9]/) {

                            printf “*”;

                            if ($3<=75) {

                                printf “RECORDER\n”;

                            } else {

                                printf “\n”;

                            }

                    }’ fruit_prices.txt;

 

2.5.2.                     while语句的基本语法:

                while (expr) {

                    actions

                }

这里expr是用条件操作符建立的表达式,expr外面的圆括号是必需的。actions可以是任何有效的awk命令序列。当一个操作包含一个或多个语句时,涵括这些actions的大括号是必须的。

                e.g.        awk ‘{ x=NF ;

                                while (x>0) {

                                    printf(“%16s”,$x);

                                    x-=1;

                                }

                                printf “”;

                        }’ fruit_prices.txt

2.5.3.                     do语句的基本语法:

                do {

                    actions

                } while (expr)

这里expr是用条件操作符建立的表达式,expr外面的圆括号是必需的。actions可以是任何有效的awk命令序列。当一个操作包含一个或多个语句时,涵括这些actions的大括号是必须的。

do语句是while语句的一个变种。区别是do语句至少执行一次.

e.g.        awk ‘{ x=NF;

            do {

                printf(“%16s”,$x);

                x-=1;

            } while (x>0);

            print “”;

        }’ fruit_prices.txt

2.5.4.                     for循环的基本语法:

                for (init_cntr; test_cntr; incr_cntr) {

                    action

                }

这里init_cntr初始化计数器变量,test_cntr是一个测试计数器变量值得表达式,incr_cntr增加计数器的值。for循环中包围表达式的圆括号是必需的。要执行的操作action可以是任何有效的awk命令序列。当一个操作包含一个或多个语句时,涵括这些actions的大括号是必须的。

                e.g.        awk ‘{

                                for (x=1;x<=NF;x+=1) {

                                    printf “%s”,$x;

                                }

                                printf “\n”;

                        }’ fruit_prices.txt

 

3.         十八、其他工具

    evel        先置换再执行命令 (内部命令)  

        在用户需要shell执行置换后再执行命令的情况下使用,

语法如下:       eval cmd

            e.g.    OUTPUT=”> out.txt”;echo hello $OUTPUT

                则屏幕打印           hello> out.txt      没有正的输出到out.txt文件。

            e.g.        OUTPUT=”> out.txt”;eval echo hello $OUTPUT

                则屏幕上没有文本输出,输出被重定向到out.txt  

    :命令的应用 

        :和if     (内部命令)  

            :命令有时在if语句中紧接着than使用。

                e.g.        if [ -x $CMD ]; then

                            :

                        else

                            echo Error: $CMD is not executable >&2

如果命令没有紧跟then,shell就会标记语法出错,所以用户可以插入:命令作为临时空操作符来代替后面的代码。

        :while

            :总是返回正确的结果,所以通常被用来建立无限循环,如下:

                    while :

                    do

                        list

                    done

                无限循环,除非在循环体内遇到break语句。

                可以使用ture命令代替:来创建无限循环,但是true时外部命令。

        :和变量置换

            可以被用来评估参数

                e.g.        :${LINES:=24} ${TERM:? “TERM not set”}

            这里:是空操作符,但shell仍然计算它的值,执行后面的变量替换,

    type命令    告诉用户一个命令的绝对路径名。(内部命令)

        语法:  type cmd1 … cmdN

            e.g.    type true vi

                    ture is /bin/true

                    vi is /bin/bin/vi

        当给定的命令是其他命令的别名时,type会给出实际调用的命令。

        当一个单一命令被指定时,type的退出码 0标示执行成功,1标示执行失败。

    sleep命令   暂停给定的秒数

        语法:  sleep n

        这里n是休眠或者暂停的秒数。n不能超过65534

    xargs命令

        从标准输入中接受单词列表的命令,并把这些单词作为参数传递给指定的命令。

        e.g.    cat filelist | xargs –n 20 rm

        这里 –n 20 是指仅仅传送20个参数到每一个命令行。

    expr命令    用于执行简单的整数运算

        基本语法:   expr int1 op int2

        这里int1和int2是整数,而op是下表的操作符之一。op前后的空格是必须的

操作符

+

-

\*

/

%

描述

整数除

模除

            整数除  表示 除不尽的部分被舍去

            模除 表示 得到除法的余数部分

        e.g.    CNT=`expr $CNT + 1`

    expr命令和正则表达式

        基本语法:   expr str : regex

这里str是要匹配的字符串,regex是正则表达式。该命令返回由一个正则表达式所匹配的字符的数目。

            e.g.    expr 1234abc : ‘[0-9]*’

                返回为4。  匹配所有数字

如果正则表达式regex中包含了转义后的括号,则expr返回的是则对括号所包含的内容。

            e.g.    expr 1234abc : ‘...\(..\)..’

                返回为4a

    bc命令 算术运算,不限于整数运算

        bc可以处理 + - * / % ^

        e.g.        AVERAGE=`echo “scale=4; $PRICE/$UNITS” | bc`      

 

4.         十九、信号

    信号基础

        shell脚本中重要的信号

名称

描述

 

0

Shell脚本结束退出时,都会给自己发信号0表明脚本执行完成并且应该终止

SIGHUP

1

控制终端发现被挂起或控制进程死亡

SIGINT

2

键盘中断

SIGQUIT

3

来自键盘的退出信号

SIGKILL

9

杀死进程的信号

SIGALRM

14

定时时钟中断(用作定时器)

SIGTERM

15

终止信号

            根据系统的不同,信号的数量略有变化。每一个信号,都有一个与之相关联的缺省动作。

列出信号

            命令1: man signal

            命令2: kill -l

    发送信号

            方法1:用快捷键  如Ctrl+C 会向程序发送一个SIGINT信号。

            方法2: kill –signal pid  

                这里singal表示要发送的信号的整数或是信号的名称。pid指进程号。

            举例1: SIGTERM信号

                kill pid    等价于      kill –s SIGTERM pid

            举例2: SIGHUP信号

                kill –s SIGHUP 1001 等价于  kill –1 1001

                向pid 1001运行的程序发送HUP 挂起 信号。

            举例3: SIGQUIT信号和SIGINT信号

在某些情况下,SIGTERM不足以用来终止一个进程。可以尝试用SIGQUIT或SIGINT信号来终止进程的执行

kill –s SIGQUIT 1001 或 kill –s SIGINT 1001

            举例4:SIGKILL信号

                kill –9 1001

                使用SIGKILL信号的缺点是:接收到它的进程没有任何机会进行退出时的清理工作。

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值