shell_03高级操作


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
 

相关内容

    暂无相关文章