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