done
注释:循环读取/etc/passwd 文件中的每一行,如果是ftp 用户,就打印出其家目录,并退出循环
${line#ftp:}:某行开头匹配到了 ftp: ;则只取该行未匹配部分
# chmod a+x string.sh
# ./string.sh
四、文本处理_1:cat;head;tail;cut;wc;sort;uniq;tr;tac;rev
文本处理是每一个系统管理员都会频繁接触的任务,其核心内容是相关工具的使用,关键要点在于灵活地结合多个工具去完成任务
1、cat --concatinate,把一个或者多个文件的內容按順序連接起來,輸出到标准輸出
# cat -n /etc/passwd --显示文件内容,并且加上行号
# cat -A /etc/passwd --打印出一些不可见的字符和位置标记
# cat 1.txt 2.txt > test.txt --合并文件
2、head --读取文件头部
# head -n 3 /etc/passwd --读取文件/etc/passwd 的前面三行
# head -n -1 file --丢弃 file 的最后一行
# head -c 3 /etc/passwd --读取文件/etc/passwd 的前面三個字节
# head -c -3 file --丢弃 file 的最后 3 个字节
# head -c 10m /dev/urandom > big --创建一个10M的文件
3、tail --读取文件尾部
# tail -n 3 /etc/passwd --读取文件 /etc/passwd 后面三行
# tail -n +28 /etc/passwd --从第28行开始读取,直到文件尾部;丢弃头部的27行
# tail -c 3 /etc/passwd --读取文件 /etc/passwd 的后面三個字节
# tail -c +28 /etc/passwd --从第28字节开始读取,直到文件尾部;丢弃头部的27字节
# tail -f /etc/passwd --跟踪文件尾部内容的变化,常用來视察日志文件的变化化,非常实用
4、cut --功能类似于awk,但是没有awk那么强大和复杂,当要对数据做分列输出时,经常使用awk,用cut的时候不多
常用选项:
-d --定义分隔符
-b --输出指定位置的字节(byte)
-c --输出指定位置的字符(character)
# echo "a;b;c d;e" | cut -d ";" -f1,3,4 -- -d 定义分隔符( 默认是 TAB );-f 定义输出对应字段
# cat -n /etc/passwd | cut -d $'\n' -f1,3-5,7 -- 使用换行符做分隔符
# echo 我是中国人 | cut -b1-3 -- -b 输出指定位置的字节(byte);一个utf8 的中文字占用3个字节
# echo 我是中国人 | cut -c2-4 -- -c 输出指定位置的字符(character);与-b 的区别表现在处理非英文字符时
# echo 做个勇敢的中国人 | cut -b1-2,9 --会输出一个 ”假“ 字
# echo -n 做个勇敢的中国人 | xxd --会发现 1,2,9 这三个字节为:e581 87
# echo -n 假 | xxd --而 ”假“ 也是
5、wc --计算数据的字节数,字符数,单词数,行数
常用选项:
-c --计算字节数
-m --计算字符数
-w --计算词数
-l --计算行数
# echo -n 我是中国人 | wc -c -- -c 计算字节数,5个utf8中文占15个字节
# echo -n 我是中国人 | wc -m -- -m 计算字符数,与-c 的区别表现在处理非英文字符时,类似于命令cut
# echo -n 我是中国人 | wc -w -- -w 计算词数,没有分割符分开,5个中文算一个词,这与中文所谓的“词”是不同的
# echo -n Uppercase CHINESE | wc -w --两个词
# echo -n Uppercase CHINESE | wc -c --17个英文字节,没有 -n 就有18个(因为还有一个换行符)
# echo -n Uppercase CHINESE | wc -m --17个英文字符,没有 -n 就有18个(因为还有一个换行符)
# wc -l /etc/passwd -- -l 计算行数
6、sort --按行对文件进行排序
常用选项:
-t --指定分割符
-k --指定排序的字段
-u --去除重复的行
-n, -h --按照数值排序
-r --反过来排序
# cut -d ":" -f7 /etc/passwd | sort -u -- -u 去除重复行
# echo -e "1\n2\n10" | sort
# echo -e "1\n2\n10" | sort -n -- -n 按数值排序,不能处理K, M, G 等单位字符
# ls -lh | tail -n +2 | sort -k5,5n -- -k 指定排序的字段
# ls -lh | tail -n +2 | sort -k5,5h -- -h 按照数值排序时,能处理K, M, G 等单位字符
# head -4 /etc/passwd | sort -t: -k7,7 -- -t 以冒号 : 作为字段分割符,按第7字段排序
# head -4 /etc/passwd | sort -t: -k7,7 -k3,3n --先按第7字段排序,若第7字段有相同的,则按第3字段排序
# echo -e "1\n2\n3" | sort -nr -- -r 对排序反转
# head -4 /etc/passwd | sort -t: -k7,7 -k3,3nr --至反转第3字段排序,也可同时对两个字段反转
7、uniq --去除连续的重复行
常用选项:
-c --计算重复行的数目
# echo -e "1\n1\n2\n1" | uniq -- 结果中仍有两个1,因为这两个1是不连续的
# echo -e "1\n1\n2\n1" | sort -u -- sort 去除重复则不用连续
# cut -d: -f7 /etc/passwd | sort | uniq -c -- 在sort命令例子的基础上,计算不同的登录shell出现的次数
8、tr --转换,删除,缩减相同字符
常用选项:
-d --删除,删除匹配到的所有字母
-s --缩减,缩减相同字符
格式: tr SET1 SET2
注意: 把集合1里面的字符转换成集合2中对应位置的字符,所以原则上两个集合中的字符数目应该相同,不过,如果两个集合中的字符数不相等,程序也不会出错,请留心这种情况下的结果。要点:
a、 tr 不关心两个集合中是什么字符,它只是简单地把对应位置的字符逐个做替换而已、
b、 tr 做的是单个字符的替换,不能替换字符串
# echo abc | tr a-z A-Z --把26个小写字母转换成相对应的大写字母
# echo abc | tr ab BA --把 a 和 b,分别转换为 B 和 A
# echo 好人做好事 | tr 好 坏 -- “好” 转换为 “坏”
# echo abcdefg | tr a-z AB --集合2较短,程序自动用集合2中最后一个字符来扩展集合2
# echo abcdefg | tr a-b A-Z --集合2较长,程序自动把集合2切短
# echo Abc | tr a-zA-Z A-Za-z --实现英文字母大小反转
# echo hello world | tr -d ow -- -d 删除,匹配到的所有字母
# echo 0123456789 | tr -d 13579
# tr -d '\012'
# echo aabbaacc | tr -s a -- -s,将每个连在一起的几个 a 缩减至一个
# echo aabbaacc | tr -s a A -- 集合之后再做转换
9、tac --把一个或者多个文件的內容按順序連接起來,輸出到標準輸出,每个文件中,内容按行号反序打印
# echo -e "111111111\n2222222" > f1
# echo -e "333333333\n4444444" > f2
# tac f2 f1
10、rev --把文件中的行左右反转
# echo -e "1234567\nabcdefg" > test
# rev test
五、扩展
1、cat,md5sum
# echo file1 > file1
# echo file2 > file2 --创建两个文件
# md5sum file1 file2 --对比他们的 md5 值是否相同
# head -c 10m /dev/urandom > bigfile --使用随机设备创建一个 10M 的文件
# head -c 3m bigfile > file1 --将前 3M 数据导入 file1
# tail -c 4m bigfile > file3 --将后 3M 数据导入 file3
# head -c 6m bigfile | tail -c 3m > file2 --将中间 4M 数据导入 file2
# ls -lh file*
# cat file1 file2 file3 > newbigfile --使用 cat 将三个文件合并到一个新大文件中
# md5sum newbigfile bigfile --在用命令比较旧大文件与新大文件的 md5sum 值