查询文件的行数
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 这样的字符串的行,他还可匹配这样的行:closethe 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信号的缺点是:接收到它的进程没有任何机会进行退出时的清理工作。
版权声明:本文为博主原创文章,未经博主允许不得转载。
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com