shell_03高级操作
文本的高级操作:
wc
-c
-l
-w
diff --查看两个文件间不同地方,对比两个文件。
-b 忽略空格引起的不同
-i 忽略大小写
-B 忽略插入空格引起的变化
sort --排序
-r 反向
-n 以数字来排序
-u 去除结果中的重复行
-t 指定分隔符
-k 指字的列
-o 将输出写到指定的文件,相当于将输出重定向到指定文件
-c 测试文件是否已经被排序
-m 合并两个已排序的文件
uniq --去除重复行
-c 统计重复的行数有几行
-i 忽略大小写
-d 只显示重复的行
-u 只显示没有重复的记录
cut --可以去除行间指定字符段
-d 指定分隔符
-f 指定列
-c 字符的序号 c1-100
join命令用于实现两个文件中记录的连接操作,连接操作将两个文件中具有相同域的记录选择出来,再将这些记录所有的域放到一行(包含来自两个文件的所有域)
-a1或-a2 除了显示以共同域进行连接的结果外,-a1表示还显示第1个文件中没有共同域的记录,-a2则表示显示第2个文件中没有共同域的记录
-i 比较域内容时,忽略大小写差异
-o 设置结果显示的格式
-t 改变域分隔符
-v1或-v2 跟-a选项类似,但是,不显示以共同域进行连接的结果
paste --合并两个文件
-d 默认域分隔符是空格或Tab键,设置新的域分隔符
-s 将每个文件粘贴成一行
- 从标准输入中读取数据
# ls | paste -d" " - - - - -
split 用于将大文件切割成小文件,split命令可以按照文件的行数、字节数切割文件,并能在输出的多个小文件中自动加上编号
-或-l 此两个选项等价,都用于指定切割成小文件的行数
-b 指定切割成小文件的字节
-C 与-b选项类似,但是,切割时尽量维持每行的完整性
# split -l50 /etc/passwd
# split -b1000 /etc/passwd sb
tr --替换,只能接受输入重定向的文件流
-d 册除某个指定的字符串
-s 删除所有重复出现的字符序列,只保留一个
# tr -s '[/n]' < AREACODE.db 将重复出现的换行符压缩成一个
BEIJING:86010
HONGKONG:852
SHANGHAI:86021
TORONTO:001416
#tr -d A-Z < AREACODE.db 删除所有大写字符
#tr -d "[/n]" < AREACODE.db 删除所有换行符 /b 退格符 /r 回车键 /t tab键
# cat test
Wooooomennnn
TTTTheyyyy
#tr -s "[a-z],[A-Z]" < test 将所有重复字符压缩成一个字符
#tr -s "[a-z]" "[A-Z]" < test 将所有小写换成大写
#tr "[o*5]" "@" < test 将文件连续出现5次o字符改成@字符
# tr -d 'A-Z' < AREACODE.db | grep -v ^$ | tee dbn.out &> /dev/null && tr -d ':' < dbn.out
# cut -d: -f2 AREACODE.db | grep -v '^$'
tee --双向重定向
-a 追加
# who | tee who.out
正则表达式(regex) --用于文本精确匹配
第一类正则表达式:
(1).: 代表任意单个字符,除了换行符
(2)*: 前导字符出现 0 次 或 多次
(3).*: 任意长度的字符
(4)^: 行的开头
(5)$: 行的结尾
(6)^$: 空行
(7)[abc] 以字符为单位的或关系
(8)[a-z] [A-Z] [0-9]
(9)[^abc] 取非
(10)^[abc] a或b或c开头的行
(11)^[^abc] 非a或非b或非c开头
(12)/<: 取单词的头
(13)/>: 取单词的尾
--扩展类的正则表达式
(14)+: 1次或多次
(15)?: 0次或1次
(16)/</> 精确匹配符号
(17)/{n/} 匹配前面字符出现n次
(18)/{n,/} 匹配前面字符至少出现n次
(19)/{n,m/} 匹配前面字符出现n次与m次之间
第二类正则表达式(POSIX标准):
[[:digit:]]: 数字
[[:lower:]]: 小写字母
[[:upper:]]: 大写字母
[[:space:]]: 空格
[[:alnum:]]: 字母数字
支持正则表达式工具(软件):
grep/egrep find locate sed awk vim
grep 'regex' file --把正则表达式写在单引号中,防止shell解释正则表达式
grep -E 'regex' file --匹配扩展的正则表达式在grep中需要加-E选项
egrep=grep -E
# find / -regex '.*/.iso$'
# find / -regex '^//var.*/.iso$'
locate -r
# locate -r '^//var.*/.iso$'
sed -n '/^root/p' /etc/passwd
awk '/^root/ {print $0}' /etc/passwd
vim
/^root
/nologin$
:%s/^root/ROOT/g
grep
o:只打印匹配出来的字符
n:显示行号
v:取反
l:匹配成功,打印文件
c:统计匹配到的字符的数量,但是统计的是行数,而不是匹配的字符个数
A:匹配行后几行
B:匹配行前几行
C:匹配行前后几行, 如 -C 2 与 -2
i:忽略大小写
q:静默执行,一般在测试时,取返回值用
r/R:对一个目录下的所有文件进行搜索
--color:用特殊颜色标示匹配到的关键字
H: 列出匹配到关键字的文件路径
egrep:拓展正则搜索
egrep = grep -E
# cat grep.txt
ggle
gogle
google
gooogle
gagle
gaagle
gaaagle
abcgef
abcdef
操作如下:
grep 'g.g' grep.txt --只要两个g字母中间有一个任意字符就可以
grep 'g*g' grep.txt --只要有一个g字母就可以。等同于grep g grep.txt
grep 'go*g' grep.txt --只要两个g字母中间有零个o或多个o就可以
grep 'g.*g' grep.txt --只要两个g字母中间有零个或任意个字符就可以
grep 'go.*g' grep.txt --只要go与g字母中间有零个或任意个字符就可以
/etc/passwd
grep ^...t /etc/passwd --查找每行里第四个字符为t的行
grep o.....$ /etc/passwd --查找每行里倒数第六个字符为o的行
grep s..n /etc/passwd --查找每行里有s和n字符,并且中间有两个字符的行
grep x:4: /etc/passwd --查找uid为4的行(只使用grep和正则表达式,不使用cut或awk的截取)
grep .*:.:4:.*:.*:.*:.* /etc/passwd --查找uid里是4的行
grep .*:.:.*4.*:.*:.*:.*:.* /etc/passwd --查找uid里包括4的行
grep .*:.*:.*:.*::.*:.* /etc/passwd --查找/etc/passwd里注释列为空的行
grep -v .*:.*:.*:.*::.*:.* /etc/passwd --查找/etc/passwd里注释列不为空的行
grep .*:.*:.*:.*:..*:.*:.* /etc/passwd
grep .*:[!x].*:.*:.*:.*:.*:.*:.*:.* /etc/shadow --查找不能在登录界面用密码正常登录的用户
grep root /etc/passwd -- 过滤关键字
grep '^root' /etc/passwd -- 以 root 开头的行
grep 'bash$' /etc/passwd -- 以 bash 结尾的行
grep '^$' /etc/passwd -- 查找空行
grep '^[ru]' /etc/passwd -- r 或 u
grep '[0-9]' /etc/passwd -- 查找数字
grep '^[^abc]' /etc/passwd -- 取反,非 a 非 b 非 c 开头
grep '/<root/>' /etc/passwd -- /< 取单词的头,/> 取单词的尾
grep -E '^root|^zhang' /etc/passwd --color -- 拓展正则 , -E,匹配以root 或 zhang 开头
grep -n root /etc/passwd -- 带行号过滤
grep -oE '(([0-9]{1,3}/.){3}[--9]{1,3})' /var/log/secure
--在文本过滤IP地址
grep [[:digit:]] /etc/passwd
grep [[:lower:]] /etc/passwd
grep [[:upper:]] /etc/passwd
grep [[:space:]] /etc/passwd
grep [[:alnum:]] /etc/passwd
find
find dir1 dir2... [options]...
find /etc/ -maxdepth 1 : -- 最大深度
find /etc/ -maxdepth 1 -type d|f|s|b|c|l : -- 最大深度 + 文件类型
find /etc/ -type f -name "passwd" -ls : --
find /etc/ -type f -user user01 -group group01: -- 按照用户和所属组搜索
find /etc/ -type f -perm 644 : -- 按照权限进行搜索
find /etc/ -type f -perm +640: -- +号表示或关系
find /etc/ -type f -perm -640: -- -号表示与关系 0代表忽略 +-号时代表空,
find /bin -type f -perm +4000 -ls: -- 查找带有 suid 权限的文件
find . -type f -size +5M -a -size -8M: -- 大于 5 M 小于 8M 的文件
find . -type f -size -5M -o -size +8M: -- 小于 5 M 大于 8M 的文件
find . -type f -size 1M -ok rm {} /; : -- 交互模式删除
find . -type f -size 1M -exec rm {} /; : -- 不交互模式删除
正则:
# cd /etc
# find . -maxdepth 1 -regex '/./.*d$'
# find . -maxdepth 1 -regex '/./h.*d$'
# find . -maxdepth 1 -regex '/./.*[0-9].*' --查找/etc目录下的文件名中包含有数字的文件
-type
-name
-size
-perm
-user -group
-maxdepth N
-mtime:
-exec -ok -o -a -not
-regex