您的位置:首页 > 运维架构 > Shell

shell 常用的命令

2012-08-30 17:40 141 查看

查询文件的行数

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.doc中10个重复次数最多的单词列表

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+c、a-c、abc、match、a3c之类的字符串的行

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

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

e.g. /ch.*doc/ 匹配字符串ch01.doc、ch02.doc、chdoc之类的字符串。

e.g. /[tT]he/ 匹配The和the

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

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

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

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

e.g. /\t\)..\1/ 匹配test、taat、 t, t、tbbt之类的串。
\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]$/p’fruit_prices.txt

1.1.4.2. 删除行

sed ‘/pattern/d’files

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.
特殊的样式匹配: BEGIN和END

语法: 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信号的缺点是:接收到它的进程没有任何机会进行退出时的清理工作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: