grep-sed命令用法:

用户切换
su username:非登录式切换
su - username:登录式切换
su -l username:登录式切换
su username -c COMMAND
 
echo -n
     -e \n
        \t
        ‘\033[31-7mXXXXXXXXXX\033[0m’
        ‘\033[41-7mXXXXXXXXXX\033[0m’
        ‘\033[31;42mXXXXXXXXX\033[0m’
        ‘\033[1-7mXXXXXXXXXXX\033[0m’
           3X为前景色;4X为背景色
           '\033[20Ghello'空20个字符再显示。
            \033代码也可用\e代替:echo -e "\e[31;5mhello,world\e[0m"闪烁效果
 
date +%s 从1970/1/1 零时零分到现在共经历了多少秒。
date +%F
date +%T
         +%D
 
******************************
 
 
***********************************
文本处理工具之grep、egrep和fgrep:
 
grep: (global search regular expression(RE) and print out the line
 
文本搜索工具,根据用户指定的文本模式对目标文件进行逐行搜索,显示能够被模式所匹配到的行
 
格式:grep [options] 'PATTERN' file,...
--color=auto
 
正则表达式:
1)基本正则表达式BRE
2)扩展正则表达式ERE
正则表达式模式都区分大小写,空格也是字符
正则表达式识别的特殊字符包括
.*[]^${}\+?|()
如果^放在模式中的其他位置而不是开头,^就是普通字符
正则表达式:是一类字符所书写出的模式(pattern)
元字符:不表示字符本身的意义,用于额外功能性的描述
 
基本正则表达式和扩展正则表达式
 
基本正则表式的元字符:
字符匹配:
.: 任意单个字符
[]: 指定范围内的任意单个字符
[0-9], [[:digit:]]
[a-z], [[:lower:]]
[A-Z], [[:upper:]]
[[:alpha:]]所有大小写字母
[[:alnum:]]包含数字和字母表
[[:space:]]匹配空白字符
[[:punct:]]标点符号
[^]:指定范围外的任意单个字符
次数匹配:用来指定匹配其前面的字符的次数
*: 任意次
例子:x*y, xxy, xy, y, 
.*: 匹配任意长度的任意字符
\?: 0次或1次
x\?y, xy, y, xxy
 
贪婪模式:尽可能的长的去匹配字符;
\{m\}: 匹配m次
\{m,n\}:
\{m,\}: 至少m次;
\{0,n\}:至多n次;
位置锚定:用于指定字符出现的位置
^: 锚定行首
^Char
$: 锚定行尾
char$
^$: 空白行
 
\<char: 锚定词首,\bchar
char\>: 锚定词尾,char\b
分组:
\(\)
\(ab\)*xy
引用:
\1: 后向引用,引用前面的第一个左括号以及与之对应的右括号中的模式所匹配到的内容
\2
...
\(a.b\)xy\1: a6bxya6b, 
 
 
He like his lover.
She love her liker.
He love his lover.
She like her liker.
 
grep 常用选项:
-v: 反向,显示不能被模式所匹配到的行;
-o: 仅显示被模式匹配到的字串,而非整行;
-i: 不区分字符大小写, ignore-case
-E: 支持扩展的正则表达式
        -A #:显示匹配行及下面的#行
-B #
-C #  显示匹配行及上下各#行
        -c:统计匹配行数
        -w:指定要搜索的单词
        -n: 在输出的每行前加上它所在的文件中它的行号
        -e:指定多个匹配模式
练习:
1、显示/proc/meminfo文件中以大小写s开头的行;
# grep "^[sS]" /proc/meminfo
# grep -i "^s" /proc/meminfo
2、取出默认shell为非bash的用户;
# grep -v "bash$" /etc/passwd | cut -d: -f1
3、取出默认shell为bash的且其ID号最大的用户;
# grep "bash$" /etc/passwd | sort -n -t: -k3 | tail -1 | cut -d: -f1
4、显示/etc/rc.d/rc.sysinit文件中,以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;
# grep "^#[[:space:]]\{1,\}[^[:space:]]\{1,\}" /etc/rc.d/rc.sysinit
5、显示/boot/grub/grub.conf中以至少一个空白字符开头的行;
# grep "^[[:space:]]\{1,\}[^[:space:]]\{1,\}" /boot/grub/grub.conf 
6、找出/etc/passwd文件中一位数或两位数;
# grep --color=auto "\<[0-9]\{1,2\}\>" /etc/passwd
7、找出ifconfig命令结果中的1到255之间的整数;
# ifconfig | grep -E --color=auto "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"
8、查看当前系统上root用户的所有信息;
# grep "^root\>" /etc/passwd
9、添加用户bash和testbash、basher,而后找出当前系统上其用户名和默认shell相同的用户;
# grep --color=auto "^\([[:alnum:]]\{1,\}\)\>.*\1$" /etc/passwd
10、找出netstat -tan命令执行的结果中以“LISTEN”或“ESTABLISHED”结尾的行;
11、取出当前系统上所有用户的shell,要求:每种shell只显示一次,且按升序显示;
# cut -d: -f7 /etc/passwd | sort -u
挑战题:写一个模式,能匹配真正意义上的IP地址;(1.0.0.1--223.255.255.254)
 
grep, egrep, fgrep
egrep: 使用扩展正则表达来构建模式,相当于grep -E 
元字符:
字符匹配:
.: 任意单个字符
[]: 指定范围内的任意单个字符
[^]: 指定范围外的任意单个字符
次数匹配:
*:匹配其前面的字符任意次;
?: 匹配其前面的字符0或1次;
+: 匹配其前面的字符至少1次
{m}: 匹配其前面的字符m次;
{m,n}: 至少m次,至多n次
{m,}: 至少m次;
{0,n}:至多n次;
锚定:
^: 行首
$: 行尾
\<, \b: 词首
\>, \b:词尾
分组:
(): 分组
 
|: 或者, ac|bc
grep -E "con(C|c)at" 
conCat或concat
 
 
 
 
练习:写一个脚本,分别统计/etc/rc.d/rc.sysinit、/etc/init.d/functions和/etc/fstab文件中各自以#开头的行的行数,以及空白行的行数;
 
练习:写一个脚本,分别复制/etc/rc.d/rc.sysinit、/etc/init.d/functions和/etc/fstab文件至/tmp目录中,文件名为原名后跟上当前的日期组成;
例如第一个文件复制后的名称为/tmp/rc.sysinit-2-14-02-16;
 
练习:写一个脚本
显示当前系统上所有默认shell为bash的用户的用户名、UID以及其在/etc/passwd文件中的行号;
 
 
 
 
egrep:
\(\)-->()
\{\}-->{}
?
+
|: C|cat匹配C或cat
   (C|c)at匹配Cat或cat
^$空行
 
grep:
\<\>精确匹配
[[:space:]]空白字符
[^[:space:]]非空白字符
find -a
     -o
     -not !
\<锁定词首
\>锁定词尾
\<\>  
[[:punct:]]标点符号
\{m,n\}
\{m,\}
\{0,m\}
\{m\}
 
 
****
sed:
sed [option] 'script' input_file
sed   -f   file  input_file
#cat  3
s/root/ruut/gp
#sed -n -f 3 /etc/passwd
 
sed编辑器基础
1 更多的替换选项
sed '[address]s/pattern/replacement/flags'  data5
有四种可用的替换标记:数字
                     g 全局替换
                     i 不区分字符大小写
                     p
             w  保存文件(只有匹配模式的行才保存到文件)
-n:禁止默认输出,常与p配合使用
-r:支持扩展的正则表达式
-e 'script' -e 'script': 指定多个编辑指令
#sed  -n  -e '/root/p' -e '/name/p'   /etc/passwd 
#sed  -n  -e '/root/p;/name/p'       /etc/passwd
#sed -n   '{/root/p;/name/p}'        /etc/passwd
#sed -n   '2,8{/root/p;/name/p}'   /etc/passwd
-i: 直接编辑原文件
 
address定界符,有两种形式的行寻址:
1)行的数字范围 2s/; 2,4s/; 2,$s/
2)用文本模式来过滤出某行(正则表达式)
            sed -n '/^bin/,/mail/p' /etc/passwd
组合命令
sed '2,4{s/fox/elephant/;s/dog/cat/}'  data1
 
2 删除行d
2d; 2,4d; /fseeio/d;   /abc/,/def/d;  
 
3 插入和附加文本
插入:sed  '[address]i\文本' data1  匹配行的前一行插入
附加:sed  '[address]a\文本' data1 匹配行的后一行附加
插入多行:sed  '[address]i\文本1\n文本2' data1
(\n表示换行,附加多行同上)
4 修改行c
sed  '[address]c\文本'  data1
 
5 字符转换命令y
sed  '[address]y/inchars/outchars/'
inchars和outchars值一对一映射,长度必须相等
 
6 打印p
1)小写p打印文本行,与-n配合使用
2)等号=命令用来打印行号
      sed -n  '1,3=;p'   /etc/passwd
3)l命令用来列出行,打印出文本和ASCII字符,如\t
 
7 向文件写入 w
[address]w filename
sed -n '/^root/w root.txt'  /etc/passwd
sed -n '1,3w root.txt'  /etc/passwd
 
8 从文件读取数据r
[address]r filename
只能指定单独一个行号或文本模式地址,sed将读入的数据插入到地址后
 
 
9 n 移到模式匹配行的下一行再进行处理
   N 合并模式匹配行及下一行;和d一起使用时,会在模式空间中删除2行,而D会删除第一行
10 !取反
sed  -n '/root/!p'   /etc/passwd
 
11 &
 
 
 
练习:
1、替换/etc/inittab文件中“id:3:initdefault:”一行中的数字为5;
# sed 's@\(id:\)[0-9]\(:initdefault\)@\15\2' /etc/inittab
2、删除/etc/init.d/funcions文件中的空白行;
# sed '/^$/d' /etc/ini.t/functions
3、删除/etc/inittab文件中位于行首的#;
# sed 's@^#@@g' /etc/initta
4、删除/etc/rc.d/rc.sysinit文件中以#后跟至少一个空白字符开头的行的行首的#和空白字符;
# sed 's@^#[[:space:]]\{1,\}@@g' /etc/rc.d/rc.sysinit
5、删除/boot/grub/grub.conf文件中行首的空白字符;
# sed 's@^[[:space:]]\{1,\}@@' /boot/grub/grub.conf
6、取出一个文件路径的目录名称,如/etc/sysconfig/network,其目录为/etc/sysconfig,功能类似dirname命令;
# echo /etc/sysconfig/network-scripts/ifcfg-eth0/ | sed 's@[^/]\{1,\}/\?$@@'
 
*********************************************
 
 
 
 
 

猜你喜欢

转载自www.cnblogs.com/as007012/p/10009128.html