固化命令的方式、sed文本处理工具

时间:2022-09-12 10:25:40

固化命令的方式

用户状态登录执行bash的顺序(用户登录自动执行)

#/etc/profile 

#/etc/profile.d

#/root/.bash_profile

#/root/.bashrc

#/etc/bashrc

非登录状态执行bash的顺序(/bin/bash就自动执行)

#/root/.bashrc

#/root/.bashrc

#/root/.bash_profile

 

什么是正则

  正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法。

在linux中,通配符是由shell解释的,而正则表达式则是由命令解释的,下面我们就为大家介绍三种文本处理工具/命令:grep、sed、awk,它们三者均可以解释正则。

sed

sed流编辑器 stream editer,是以行为单位的处理程序

  -n静默模式不输出

  -e扩展模式,一行有多个命令时

  -i 修改文件,将内容写进文件

  -f 将“”内的规则写到文件内

  -r扩展模式

定址的方法 1.数字 2.正则

  1.数字

    1单行
    1,3 范围从第一行到第三行
    2,+4 匹配行后若干行
    4,~3 从第四行到下一个3的倍数行
    2~3 第二行起每间隔三行的行
    $ 尾行
    1! 除了第一行以外的行 

  2.正则

  正则必须用//包裹起来     /正则命令/命令    #举例sed "/^root/d”  删除 root开头的行 
      扩展正则需要用 -r 参数或转义

  ^ 行首
  $ 行尾
  . 除了换行符以外的任意单个字符
  * 前导字符的零个或多个
  .* 所有字符
  [] 字符组内的任一字符
  [^] 对字符组内的每个字符取反(不匹配字符组内的每个字符)
  ^[^] 非字符组内的字符开头的行
  [a-z] 小写字母
  [A-Z] 大写字母
  [a-Z] 小写和大写字母
  [0-9] 数字
  \< 单词头 单词一般以空格或特殊字符做分隔,连续的字符串被当做单词
  \> 单词尾

  ? 前导字符零个或一个
  + 前导字符一个或多个

 


增删改
  a 追加 sed “3a  11111111” 在第三行后面一行追加11111111
    c 替换 sed “3c  11111111”  将第三行替换为11111111                                                                                                     sed "/^root/c   11111111 " 将root开头的行替换为11111111      
  i 前插 sed “3i 11111111” 在第三行后面一行前插11111111
   d 删除   sed “3d” 删除第三行  “1,3d”删一到第三行  “1d;3d”删第一行和第三行

  s 字符串替换 sed "s/old/new/"   如果匹配行有两个匹配内容只改第一个   sed "s/old/new/g"   全部改
         sed "4s/old/new/" 数字定址,替换第四行 sed "/^root/ s/old/new/" 正则定址,替换以root开头的行

        sed -r "s/([^a-z])([a-z]+)$/\1/"  删除行尾一个单词

        sed -r "s/([^a-z])([a-z]+)([^a-z])([a-z]+)$/\3\2\1\4/"  交换行尾两个单词

输入输出

  p 打印匹配的行   一般和 -n 参数连用,以屏蔽默认输出   sed -n  “3d”只打印第三行
  r 从文件中读入
  w 写入到文件中


控制流
  ! 命令取反 例: 1!d 删除第一行以外的行
  {} 命令组合 命令用分号分隔 {1h;G} 可以理解为 -e 参数的另一种写法

  = 打印行号(输入行的号码,而非处理的次数行号) 例如: sed -n '2{=;p}' infile
  n 读入下一行到模式空间 例:'4{n;d}' 删除第5行
  N 而是追加下一行到模式空间,再把当前行和下一行同时应用后面的命令

 

  

 
(正则表达式及字符处理)
目标文件/etc/passwd,使用grep命令或egrep
1.显示出所有含有root的行:

 grep 'root' etc/passwd 
2.输出任何包含bash的所有行,还要输出紧接着这行的上下各两行的内容:

 grep -C 'bash' etc/passwd 

3. 显示出有多少行含有nologin。

grep -c 'nologin' /etc/passwd

4.显示出那些行含有root,并将行号一块输出。

grep -n  'root' /etc/passwd
5.显示出文件中
6.新建用户
abominable
abominate
anomie
atomize

编写正则表达式,将他们匹配出来

egrep 'a.omi(nabl|nat|z|)e' /etc/passwd

7.建四个用户
Alex213sb
Wpq2222b
yH438PIG
egon666
egon

过滤出用户名组成是字母+数字+字母的行

egrep '^[a-Z]+[0-9]+[a-Z]+' /etc/passwd

8.显示出/etc目录下所有包含root的文件名

ls -R /etc |grep 'root' 或者tree |grep 'root'


9. 过滤掉/etc/ssh/sshd_config内所有注释和所有空行

grep -v '^#' /etc/ssh/sshd_config |grep -v '^ *$'
作业三:Sed作业:以/etc/passwd文件为模板

sed -n 静默模式,不输出

sed -f 文件(里面写上匹配的规则) test

1,删除文件每行的第一个字符。

 sed -r 's/^(.)(.*)/\2/' /etc/passwd

2,删除文件每行的第二个字符。

sed -r 's/^(.)(.)(.*)/\1\3/' /etc/passwd

3,删除文件每行的最后一个字符。

sed -r 's/(.*)(.)$/\1/' /etc/passwd

4,删除文件每行的倒数第二个字符。

sed -r 's/(.*)(.)(.)$/\1\3/' /etc/passwd

5,删除文件每行的第二个单词。

sed -r 's/^([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]+)/\1\2\4/' /etc/passwd

6,删除文件每行的倒数第二个单词。

sed -r 's/^([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)&/\1\3\4/' /etc/passwd

7,删除文件每行的最后一个单词。

sed -r 's/^([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)&/\1\2\3/' /etc/passwd

8,交换每行的第一个字符和第二个字符。

sed -r 's/^[a-Z][a-Z]([a-Z]+)/\2\1\3/' /etc/passwd

9,交换每行的第一个字符和第二个单词。

sed -r 's/^(.)([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]+)/\4\2\3\1\5/' /etc/passwd

10,交换每行的第一个单词和最后一个单词。

sed -r 's/^([a-Z]+)([^a-Z]+)(.*)([^a-Z]+)([a-Z]+)$/\5\2\3\4\1/' /etc/passwd

11,删除一个文件中所有的数字。

sed -r 's/[0-9]//g' /etc/passwd

12,删除每行开头的所有空格。

sed -r 's/^ *//g' /etc/passwd

13,用制表符替换文件中出现的所有空格。

sed -r 's/ /\t/g' /etc/passwd

14,把所有大写字母用括号()括起来。

sed -r 's/[A-Z]/(&)/g' /etc/passwd

15,打印每行3次。

sed 'p;p' /etc/passwd

16,只显示每行的第一个单词。

sed -r 's/(^[a-Z]+)([^a-Z]+)(.*)/\1/' /etc/passwd

17,打印每行的第一个单词和第三个单词。

sed -r 's/(^[a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]+)(.*)/\1\5/' /etc/passwd

18,用命令获取格式为 mm/yy/dd 的日期格式,结合管道,将其换成 mm;yy;dd格式

date  +%m/%Y/%d | sed -r 's/[/]/;/g'