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

shell 脚本攻略--命令之乐

2012-09-21 19:01 627 查看
cat -s file 压缩file中的空白行

cat -T file 将file中的制表符替换成^

cat -n file 显示file中的行 类似vi 中的set nu

__________________________________________________________________________

2.记录终端的会话。script 能够将终端的 会话录制下来,利用scriptreplay就可以将录制的内容会放出来。好处在与所有的操作都能记录。

script -t 2 > timeing.log -a out.session

#commad1

#commad2

#exit 录制完成。

scriptreplay time.log out.session

或者简单的 script -a out.log -a 表示追加 默认是覆盖。

用cat vi 等直接查看。

#!:默认情况 可以直接使用 script 他会自己生成一个默认的typescript文件,但是下次记录就会覆盖typescript文件。所以使用 -a 选项。

#!:记录会话的时候 不会记录不显示终端的输出,例如passwd root 的密码输入。

#!:录制过程中尽量不要是用vim 等全屏的操作,尽量使用set。

#!:录制过程中一些del backspace的键 会被录制成[k 等字符

#!:录制过程中 一些需要图像的 setup net-config 不会被记录。

__________________________________________________________________________

3. 利用mkfifo 进行广播会话,类似win的NeetMeeting

#mkfifo使用指定的文件名创建FIFO(也称为"命名管道").

"FIFO"是一种特殊的文件类型,它允许独立的进程通讯. 一个进程打开FIFO文件进行写操作,而另一个进程对之进行读操作, 然后数据便可以如同在shell或者其它地方常见的的匿名管道一样流线执行.

默认情况下,创建的FIFO的模式为0666('a+rw')减去umask中设置的位.

#mkfifo -m 777 testfifo 创建fifo文件权限是777 (终端-1)

# cat testfifo (终端-2)

#script -f testfifo(终端-1)

#输入命令

#exit 完成

这个时候终端-2 就可以及时观看内容了。

__________________________________________________________________________

find命令:查找

find /home -name xxx 查找 /home 下文件名为xxx的文件或文件夹

find /home -iname xxx 查找 /home 下文件名为xxx的文件(不区分大小写)

find /home -name "*.txt" -o -name "*.sh" 查找/home 下已txt扩展名结尾或者sh扩展名结尾的文件或文件夹

find /home -regex b* 查找 /home 下文件名为b*的文件或者文件夹

或者

-iregex (忽略大小写)

-name 与 -regex的区别:

-name, -iname最大的区别就在于 -regex是把find输出的整个结果(有别于绝对路径名)作为要匹配的对象, 而不仅仅是结果的最后一部分, 举例

/tmp

目录下有且仅有 aaa, aa, 1, 2 这些文件

find -name "a*"可以找到

aaa和aa



find /tmp -regex "a*"就不行, 它一个都找不到, 因为找到的每个结果是这样的

/tmp/aaa

/tmp/aa

-name 是对结果中的"aaa"和"aa"这个部分进行匹配, 而-regex却是对完整的

"/tmp/aaa"和"/tmp/aa"进行匹配.

所以你要写作

find /tmp -regex ".*a.*"

在上面例子中最大区别就是 .* 来表示任意长度字符串.

2. 注意上面的是.*而不是*

-name所能解释的是基于shell中file glob的匹配字符, 包括:

(1)*表示任意长度字符串

(2)?表示任意的单个字符

(3)[set] 表示一个可选字符集合

(4)[^set]或[!set]表示以ASCII为全集对[set] 求补集的一个集合

(5)brace expansion, 即把/tmp/{a,b,c}扩展为三个字串

/tmp/a /tmp/b 和/tmp/c

注意 shell的file globing机制往往不被认为是正则表达式.

-regex接受的是"正统"的正则表达式

这个说起来东西多了, 基本上它跟emacs文档里讲的regex是一样的, 因为find手册里regex的解释部分实际就是链接到emacs 中讲解regex的那个部分.

find /home ! -name *.txt 查找 /home 下文件名除了xxx的文件或文件夹

find /home -maxdepth 1 -ame b.txt 查找/home 当前下的文件名为b.txt的文件或文件夹,-mandepth 指定查找的最大深度,默认情况下是搜索所有目录和子目录,1为当前目录。2为/home 下的2级目录,/home/dir/ 3.4.5 依次类推各级别子目录。

find /home -mindepth 2 -name b.txt 查找/home/dir/dir 下文件名为b.txt的文件或文件夹。 -mindepth 指定最小深度,2表示距离/home 2个目录以后匹配的 文件。也就是 /home/dir1/dir/b.txt

find指定查找类型:find -type

-f 普通文件

-l 链接文件

-d 目录

-c 字符设备

-b 块设备

-s 套接字 socket

-p fifo管道文件

根据时间查找

atime mtime ctime 访问时间 修改时间 元数据修改时间

find /home -type f -atime -7

查找/home 下前7天之内访问的文件

find /home -type f -atime 7

查找/home 下整好是前7天访问的文件

find /home -type f -atime +7

查找/home 下最后一次访问时间超过7天的文件

atime mtime ctime 的单位是天 对应的还有 amin mmin cmin 单位是分钟

find /home -type f -size 10k 基于文件类型的大小

-10K 小于 +10K 大于 10K 相等

单位可以使 w k m g

find /home -type l -perm 644 基于权限的查找

find /home -type c -user root 基于用户的查找

find与exec特性

find查找之后的结果可以利用exec进一步进行操作,与其他命令结合

find /home -type b ! -user root -maxdepth 2 -perm 700 -size -100k -exec chown root:root {} \;

/home 下2级目录以内类型为块设备权限为700大小小于100k的非root文件,执行root:root {} 表示每一个匹配文件

xargs 命令

有些命令只能接受命令行参数的形式,通过grep出来的stdin数据流不能别使用,xargs是一个擅长将标准输入转换成特定命令的命令参数,也可以将单行的数据流变成多行

cat bc.txt |xargs

将多行变成一行 用空格分隔

cat bc.txt |xargs -n 3

将每行按照3个字符分隔

cat bc.txt |xargs -d x

已x字母为分隔符,默认是空格

-n 的分别取值功能

args.txt文件内容

1.ls

2.lh

3.vi

cat args.txt |xargs -n 1 /root/test.sh

等于分别执行

ls /root/test.sh

lh /root/test.sh

vi /root/tet.sh

传递命令的时候 -n X 说明一次传递几个参数 1 就是1个 N就是N个,当列表取值不够的时候,余下几个就执行几个,例如一共3个 每次-n 2 个 第2次就只能执行一个

cat args.txt|xargs -I {} ./cat tt.txt -p {}

{}表示每一个匹配,分别执行一次。

等于cat tt.txt -p ls{lh}{vi}

_______________________________________________________________________

tr命令使用

tr可以对标准输出的字符或者各种标识符进行转换(translate)

tr [options] set1 set2

将标准输入用 set2 转换 set1,如果set2 的长度小于set1,set2会不断重复最后一个字符知道与set1长度相等,如果set2的长度大于set1,那么超出部分字符会被忽略

echo "HI" |tr 'A-Z' 'a-z'

用集合的形式用小写字母替换大写字母

集合例子:ABD-} aA., a-ce-x a-c0-9

起始-终止,如果不是一个连续的字符序列,那么会被视为包含了3个元素的组合

cat a.txt |tr '\t' ' '

用空格替换制表符,就是tab

cat a.txt |tr -d ' '

-d指定出现在文本中的所有空格字符都删除

cat a.txt |tr -c '0-9'

-c指定补集,意思就是除了0-9(所有数字),其余的空格符换行符字母等等全部删除

cat a.txt|tr -s '\n'

将文本中的重复的换行符压缩成一个换行符

echo "i am who ti" |tr -s ' ' 压缩重复的空格变成一个

输出 i am who ti

cat sum.txt

1

2

3

4

5

#cat sum.txt |echo $[ $(tr '\n' '+') 0 ]

#15

tr将\n 换行成+,因此得到1+2+3+4+5+,但是尾部多了一个+,于是追加了一个0,$[1+2+3+4+5+0]执行运算,于是等于15

本文出自 “生活在于折腾” 博客,请务必保留此出处http://linuxchang.blog.51cto.com/6053586/1002125
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: