1. 常用的文本操作
1.1. 取出最近访问的5个普通文件,并要求输出文件名和最后的访问时间
执行命令:
$ls –lut|grep “^-”|head -5|cut –c41-
解析:-t表示ls命令在输出时会按修改时间来排序;-u表示ls –l命令显示出文件的最后访问时间;”^-”是正则表达式,表示以横杆字符’-’起始的行;通过cut命令把无关信息删除,选项-c指定了cut命令会保留并输出那些字符。
选项-c有两种指定参数的方式:一种是通过横杆字符’-’指定一个范围;另一种是通过逗号连接多个范围。范围有如下一些指定的方式:
范围 | 描述 |
N | 第N个字符 |
N- | 从第N个字符一直到当前行结束 |
N-M | 从第N个字符一直到第M个字符 |
-M | 从第一个字符一直到第M个字符 |
1.2. 假如有两个文件name.txt和tel.txt,它们分别记录了员工的姓名和电话号码,如果希望把两个文件中的用户名和电话号码一一对应起来,该如何操作?
案例:
name.txt内容如下:
Matti
Aarnio
Dragos
Acostachioaie
Mark
Adler
Monalisa
Agrawal
tel.txt内容如下:
555-0542
555-1234
555-1256
555-2345
555-3456
555-4567
555-5678
555-6789
命令执行:
$paste –d’:’ name.txt tel.txt|cat -n
1.3. 检查当前系统中的各种Shell程序,统计出它们各被多少个用户使用,并把统计结果按照从多到少的顺序打印出来。
执行命令:
$cat /etc/passwd | cut –d: -f7|sort|uniq –c|sort –nr
解析:选项-f7表示每行的第7个字段;uniq –c是合并统计;sort –nr 选项-n表示按照数字的大小排序,选项-r表示从大到小显示结果。
1.4. 统计文本文件中各个单词出现的个数
案例:
#!/bin/bash
#定义函数count,用来统计一个文件中的字数
count(){
#函数需要一个参数才可以正确调用
if [$# !=1]
then
echo " Need one file parameter to work!"
exit 1;
fi
#删除标点符号和特殊字符
#构建一个很长的管道命令,每一段都单独写在一行中,增加可读性
tr '+-=*.;:{}!?<>"\n\t''' < $1 |\
#把所有大写字母转换为小写字母
tr 'A-Z' 'a-z'|\
#把连续重复的空格符替换为一个空格符
tr -s ''|\
#把空格符转换为换行符
tr '' '\n'|\
#把相同的单词放到一起
sort|\
#删除重复单词,并进行统计
uniq -c|\
#根据重复的次数进行排序
sort -rn
}
echo
echo "This script can count words of a specified file."
#使用空命令冒号构建循环
while :
do
read -p "Enter the file path(or quit):"
case "$REPLY" in
[Qq]|[Qq][Uu][Ii][Tt])
echo " Bye."
#在输入大、小写quit时,退出
echo "$REPLY"
exit 0
;;
*)
#判断输入的是一个可读的普通文件,并且内容不为空
if [ -f "$REPLY" ] && [ -r "$REPLY" ] && [ -s "$REPLY" ]
then
#当用户输入一个合法文件时
#调用count函数统计文件的单词个数
count "$REPLY"
else
#如果输入了非法文件,显示不能处理它
echo "$REPLY can not be dealed with."
fi
;;
esac
done
exit 0
语法:
tr [option] .. SET1 [SET2] --SET1会被SET2替换
1.5. 所有特殊字符替换
省略
1.6. 把TAB转换成空格符,且保证其他字符的位置不变
#cat命令的选项-T将把TAB字符显示为^I
$cat –T TABS.txt
#使用expand命令把TAB字符替换为空格
$expand TABS.txt | cat -T
2. 其他操作
1
2
2.1 windows系统的文件与Linux系统的文件之间进行转换
在Ubuntu Linux系统中,可以安装tofrodos包,使用其中的fromdos命令和todos命令来转换文本文件。
2.2 求一个字符串的长度
expr length STRING
2.3 把某些命令的输出格式化成一个表格
$(printf “PERMISSIONS LINKS OWNER GROUP SIZE DATE HH:MMFILE-NAME\n”;ls –l|sed 1d)|column –t
解析:命令ls –l|sed 1d输出当前目录下的文件列表,其中ls命令的输出经过管道传递给sed 1d命令进行处理,目的是删除目录列表中的第一行。