分享

读《linuxshell脚本 攻略》第二章总结

 风雪夜归人_95 2013-12-05
1.echo 'Text through stdin' | cat - 123.txt 会显示字符串和123.txt的内容。若去掉“-”,则只

会输出123.txt的内容
  cat -s 123.txt 输出时可以将文本中的连续的多行空格压缩到一行空格,实际不改变文本的内容。
  cat 123.txt | tr -s '\n' 则在输出时去掉文本之间的空格行,但是最开始的空行仍然是压缩为一行


2.有时需要将某个操作录制下来重新看,可以使用
script -t 2> timing.log -a output.session (系统会提示Script started, file is 

output.session)
。。。。(输入你要录制的命令)
exit     (提示Script done, file is output.session)
scriptreplay timing.log output.session (运行这个就能看到效果了。timing.log存储每条命令运行

的时间,output.session存储命令输出,)

3.同步你的操作到另一个shell中
(主shell)$:mkfifo scriptfifo        (从shell)$:cat scriptfifo
(主shell)$:script -f script fifo
(主shell)$:commands                  (从shell)$:显示主shell中的操作

4.find命令
find . -print 打印当前目录下(\n作为文件与文件之间的分隔符)
find . -print0 同上,分隔符改为空格    (..则表示上一层目录)
find . -iname "*.sh" 根据名字查找某个文件,忽略大小写
find . \( -name "*.txt" -o -name "debug.sh" \) 注意括号必须使用转义字符,且括号后面都要有空

格,不然都会报错
find /home/users/  -path “*Linux*” 根据文件名或者文件路径来搜索
find /home/users/ -regex “*Linux*” 同上,但使用正则表达式来搜索
find . -regex ".*\(\.py\|\.sh\)$"   这个后面的$符不知道是干什么的,我去掉发现也没什么影响

find . ! -name "*.txt" -print 根据文件名找到所有不是指定后缀的文件名

find . -maxdepth 1 -type f -print   限定搜索的最大层数为1
find . -mindepth 2 -type f -print   限定搜索的最小层数为2
文件类型搜索其中 -type后可以跟的符号:
regular file                f
Symbolic link               l
Directory                   d
Character special device    c
Block device                b
Socket                      s
Fifo                        p

时间搜索:
-amin 、-mmin、-cmin与下面三个的区别在于时间单位为每分钟
Access time(-atime):最后一次打开这个文件
Modification time(-mtime):最后一次修改这个文件
Change time(-ctime):元数据(权限或所有权)最后一次修改
find . -type f -atime -7 -print  打印所有在这个时间过去7天内的文件
find . -type f -atime  7 -print   打印所有在这个时间正好7天的文件
find . -type f -atime +7 -print  打印所有在这个时间过去大于7天的文件

find . type f -newer file.txt -print 打印所有比file修改更新的文件

-size 通过大小来找 
b 512 byte; c bytes;w 2 byte words; k kilobyte; M Megabyte; G Gigabyte
-delete 找到后删掉这个文件

find . \( -name ".git" -prune \) 从当前路径排除.git这条路径

5.xargs默认是将多行输出合并到一行输出,如果在后面加参数“-n no”,则是no个数为一行的输出数据

,默认的分隔符是空格,可以修改,在后面加参数 “-d char”,则指定char为分隔符。

cecho.sh里面就一句:echo $*'#'
cat args.txt | xargs -I {} ./cecho.sh -p {} -l
用{}(只是一个符号,可替换成任意字符)来代替从stdin中读到的数据,-I代表循环执行,这里的

args.txt里面有三个数据,故有三次循环。然后再把"-p {} -l"打印出来。({}里面有每次从stdin中读

出的数据,-p、-l没有特殊含义在这里)

6  find . -type f -name "*.txt" -print0 | xargs -0 rm -f
-print0产生输出时用空格作为分隔符,-0 interprets that the delimiting character is \0.

7.tr {options} set1 set2
当集合2的长度小于集合1的长度时,就会重复集合2的最后一个字符自动补成集合1的长度;当集合2的长

度大于集合1的长度时,就会忽略2中多的部分的内容
例如:
echo "HELLO WHO IS THIS" | tr 'A-Z' 'a-z'
如果是连续的集合可以用“开始字符-结束字符”,按顺序一一对应,可用于简单的加密解密

tr -d sets 命令可从stdin中剔除掉sets中的内容

echo hello 1 char 2 next 4 | tr -d -c '0-9 \n'
stdin中的内容除去后面那个集合中间的内容,其他的都删掉

tr -s sets 命令可将stdin中内容出现重复的sets中出现的元素压缩到一个

8.md5sum file1 file2 file3 .... > file1_sum.md5 file2_sum.md5 file3_sum.md5命令可以生成各自

文件对应的checksum
  md5sum -c file_sum.md5 命令可以检查文件的checksum是否正确,正确会提示OK

  还有一种是针对路径的,意味着该路径下所有的文件都要检查。
  md5deep -rl directory_path >directory.md5
  -r代表递归, -l代表使用相对路径

9.sort file1 file2 file3 ... >sort.txt
将排序的结果重定向到sort.txt中
sort -n sort.txt  按文件内容数量排列
sort -r sort.txt  按反转的方式排列
sort -C sort.txt  检查是否排序,若排过,则返回值为0
sort -m sort1.txt sort2.txt 将两个排列过的文件合并

uniq命令总是和sort命令一起使用 去掉重复的项

10.dd if=/dev/zero bs=100k count=1 of=data.file
直接磁盘(区块)复制,输入设备时/dev/zero,输出设备是data.file,复制大小为100k,复制一次,dd 

出来的是块设备,一般用来测试磁盘读取性能。
------------------------
Unit size        code   |
------------------------
Byre(1B)          c     |
Word(2B)          w     |
Block(512B)       b     |
kilo Byte(1024B)  k     |
Mega Byre(1024KB) M     |
Giga Byre(1024MB) G     |
------------------------

11.用%提取文件的名字,用#提取文件的后缀
例如:
file_sh="test.sh"
name=${file_sh%.*}
extension=${file_sh#*.}
echo File name is:$name ,Extention is:$extension
结果:File name is:test,Extention is:sh

%是一个懒惰模式的操作符,它从右到左找到最小的匹配,而%%则相反,它总是从右到左找最大的匹配,

例如:
var=hack.fun.book.txt
echo ${var%.*}  结果:hack.fun.book
echo ${var%%.*} 结果:hack

# 和## 和上面的是一一对应的,只不过匹配的方式是从左到右
echo ${var#*.} 结果: fun.book.txt
echo ${var##*.} 结果: txt

12.在字典中查询某个单词看是否存在的方法:
1).look word filepath    当不加路径时,默认路径为/usr/share/dict/words
2).grep "^word$" filepath
3).aspell list 但有该单词不返回任何值,若不存在则返回输出文字

13.交互式读取标准输入
1)read -p "enter number:" no;
2).echo -e "2\nhello\n" > input.data
   cat input.data

14.comm A.txt B.txt
结果会出现3栏,第一栏是A.txt中含有的,第二栏是B.txt中含有的,第三栏则是二者共存的。若在该命

令后加参数“-i”(i=1,2,3),则会去掉第i列的输出

comm A.txt B.txt -3 | sed 's/^\t//'则会去掉输出结果中的tab。s代表substitute,"/^\t\"代表\t

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多