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 ‘[: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 | 用一个表达式置换另外一个 |
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不匹配样式,则为真 |
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是如下表的数值操作符。
操作符 | + | - | * | / | % | ^ |
描述 | 加 | 减 | 乘 | 除 | 取模(余) | 求幂 |
赋值操作符语法: name operator num
这里nmae是变量名,num是变量的名字或常数,operator是如下表指定的操作符之一。
操作符 | += | -= | *= | /= | %= | ^= |
描述 | 加 | 减 | 乘 | 除 | 取模(余) | 求幂 |
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 | 输入记录分隔符(默认是新起一行) |
应用:改变输入字段分隔符。
方法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信号的缺点是:接收到它的进程没有任何机会进行退出时的清理工作。
相关文章推荐
- hadoop中常用的shell命令
- HBase Shell常用命令
- RedHat Linux Shell常用命令(多数也适用于Unix和AIX)
- 常用shell命令
- shell脚本基础与常用命令
- (Hadoop学习笔记-2) HDFS常用Shell命令
- Hadoop常用笔记shell命令
- hbase常用shell命令
- 16、常用shell命令方法
- 常用的shell命令
- iOS开发 ----- vim相关以及常用shell命令
- Hbase常用Shell命令
- 25个好用的Shell脚本常用命令分享
- Shell脚本常用命令
- HBase 常用Shell命令
- adb 和 shell、Logcat 常用命令
- hadoop HDFS 常用shell命令
- HBase常用Shell命令学习
- Shell常用命令总结
- Linux常用shell命令