LINUX操作系统基本符号说明

Crushz-2024 / 2024-08-31 / 原文

  1. 课程介绍部分
    1). 系统符号 # ~ $ . ..
    2). 通配符号 * {}
    根据文件名称进行匹配信息
    3). 正则符号 *
    根据内容进行匹配

  2. 系统符号作用
    a 简化操作 如:.. ~ ; &&
    b 进行匹配

  3. 系统特殊符号:

    1. 基础符号系列
      美元符号:$ //取变量内容、配合awk去列、普通用户提示符、
      叹号符号: ! //取反、强制
      竖线符号: | //前一个命令执行结果交给后面命令处理
      xargs: 将信息进行分组显示
      同时查询多个文件并查看这些文件中的内容:

    touch abc{1..9}.txt

    find / -maxdepth 2 -type f -name "abc*" | xargs cat

    将查询到的多个文件的详细信息显示出来:

    find / -name "abc*" | xargs ls -l

    需求:删除/root下的三个abc文件

    find / -maxdepth 2 -type f -name "abc*" | xargs rm -rf

    作业:
    查找指定数据信息进行复制:查找出*.txt文件,批量复制到/tmp目录:

    1. 将找到的信息放到cp 和 最终目录中间
      find /root -type f -name "*.txt"|xargs -i cp {} /abc456
    2. 利用cp指明谁是数据最终保存的目录信息
      find /root -type f -name "*.txt"|xargs cp -t /abc456

    查找指定数据信息进行移动:查找出.txt文件,批量移动到/tmp目录:
    # find /root -type f -name "
    .txt"|xargs mv -t /abc

    1. 引号符号系列
      '' 输出的信息,写什么显示什么
      [root@pillar1m abc123]# echo 'abc123 $LANG $abc456'
      abc123 $LANG $abc456
      "" 和单引号功能类似 但对特殊信息会做解析
      [root@pillar1m abc123]# echo "abc123 $LANG $abc456"
      abc123 en_US.UTF-8 123
      `` ($()) 将引号中的命令先执行,将执行结果交给引号外面的命令进行处理
      没有引号 和双引号功能类似 但是可以直接识别通配符信息,如:# echo

    2. 重定向输出符号:

      1> 标准输出重定向符号
      2> 错误输出重定向符号

      1>> 标准输出追加重定向符号
      2>> 错误输出追加重定向符号
      &> 正确错误重定向输出

      作业:
      如何将正确信息和错误信息都输出到文件中:

      方法一: 将正确和错误信息同时保留到一个文件
      [root@pillar1m abc123]# echo abc123 >>/abc123/info.log 2>>/abc123/info.log

      方法二: 将正确和错误信息同时保留到一个文件
      [root@pillar1m abc123]# echo abc123 &>/abc123/info.log

       方法三: 将正确和错误信息同时保留到一个文件
      

      [root@pillar1m abc123]# echo abc123 >/abc123/info.log 2>&1

      <    标准输入重定向符号
      

      passwd --stdin zhangsan < pass.txt

      << 标准输入追加重定向符号
      cat >>/abc123.txt<<EOF
      XXX
      XXX
      EOF

    3. 路径信息系列
      ../ 上一级目录
      ./ 当前路径
      ~ 返回到家目录

      • 两个目录之间进行快速切换
      1. 逻辑符号系列
        && 与逻辑符号 前一个命令执行成功, 再执行后面的命令
        || 或逻辑符号 前一个命令执行失败, 再执行后面的命令

      &&符号实践操作:
      作业:
      需要创建一个/test目录, 在目录中创建一个abc123.txt

      ||符号实践操作
      需求: /test/abc123.txt删除失败了,在/test/error.txt文件中生成失败信息

      [root@pillar1m tmp]# rm /test/abc1231.txt || echo "failed" >>/test/error.txt

      [root@pillar1m tmp]# rm /test/abc123.txt || echo "failed" >>/test/error.txt

  4. 系统通配符号:
    利用通配符号匹配文件名称信息

    • 模糊匹配所有内容 abc123 abc ab a*
      find / -name "ab" //0个或多个字符
      ll /abc123/
      .txt

    {} 生成序列信息 (生成一行序列)
    生成连续序列
    echo {1..10}
    echo {001..100}
    echo {a..z}
    echo {A..Z}
    生成不连续序列
    echo {1..10..2} 奇数序列
    echo {0..10..2} 偶数序列
    echo {www,bbs,blog}

    生成组合序列
    [root@pillar1m tmp]# echo {A,B}{01,02}
    A01 A02 B01 B02
    [root@pillar1m tmp]# echo A{01,02}
    A01 A02
    [root@pillar1m tmp]# echo A{,02}
    A A02

    常用的文件备份操作:

    cp /etc/passwd /etc/passwd.back

    cp /etc/passwd

    生成银行卡密码全部组合并统计总共多少个密码:

    echo {0..9}{0..9}{0..9}{0..9}{0..9}

    作业:

    1. 在/abc123目录中创建test.txt文件,并在/abc123目录中生成test.txt.back备份文件

    mkdir /abc123 && touch /abc123/test.txt && cp /abc123/test.txt

    1. 如何将刚刚的备份文件快速还原
    # cp /abc123/test.txt{.back,}
    
  5. 课程内容总结
    01. 系统符号
    1. 系统常用符号 # $
    2. 路径系列符号 ~ - .. .
    3. 重定向符号 > >> 2> 2>> < << &> 2>&1 /dev/null
    4. 逻辑符号 && ||
    5. 引号符号 "" '' `` ($()) 没有引号
    02. 通配符号 根据文件名称进行筛选过滤
    * 模糊匹配字符
    {} 生成序列信息 / 生成组合序列 (快速备份文件/快速恢复文件)

操作系统正则符号说明

  1. 正则符号

    1. 利用正则符号匹配文件内容信息
    2. 正则符号经常出现在各种开发语言中, python java php shell
    3. 正则符号经常被三剑客命令使用
  2. 基础正则符号: basic

    1. 尖角符号:^
      以什么开头的信息

    ll /etc | grep "^d"

    1. 美元符号:$
      以什么结尾的信息

    ll -F /etc/ | grep "/$"

    1. 将全部内容显示,但不要显示空行
      ^$ -- 空行

    grep -v "^$" 文件中过滤

    测试环境:
    cat >>~/test.txt<<EOF
    I am Edison!
    I can sing.

I like music, hip-hop!
our site is https://clot.com
my qq num is 1234567890.

not 12345678900.
my god ,i am not Big handsome boy,but Edison!
EOF

    4) 点符号 .
   匹配任意一个字符,且只有一个字符
   命令执行结果:
   [root@pillar1m ~]# grep "." ~/test.txt
   
   显示匹配过程:
   [root@pillar1m ~]# grep "." ~/test.txt -o

    5) 星符号 *  ???
   匹配前一个字符连续出现了0次或者多次
   [root@pillar1m ~]# grep "0*" ~/test.txt
   
6) 点和星结合: .* 匹配任意所有信息  .* == *
   [root@pillar1m ~]# grep "^o.*m$" ~/test.txt     //必须加.表示以.为参照匹配所有内容
   
   问题: 贪婪匹配问题:
   [root@pillar1m ~]# grep "^m.*o" ~/test.txt
my god ,i am not Big handsome boy,but Edison!
   指定具体信息阻止贪婪匹配
   [root@pillar1m ~]# grep "^m.*od" ~/test.txt

    7) 转义符号: \
   \作用:
   01. 将有特殊意义符号,转义成普通信息进行识别
    将文件中的以 . 结尾的信息进行过滤:
    # grep ".$" ~/test.txt         //该命令无法真正过滤出以.结尾的行
    # grep "\.$" ~/test.txt        //使用转义符号
   02. 将没有意义的信息转义为有特殊意义的信息
       \n   换行符号
       \t   制表符号
       换行符号作用:
    案例:
    # echo -e "编号\t姓名\t性别\n01\t张三\t男\n02\t李四\t女"

    # echo -e "\e[1;31m This is red text \e[0m"            //e为字体上色,\e[0m,为将颜色重置为默认颜色,否则之后所输出的所有信息都将是31号颜色:
    # echo -e "\e[1;31m This is red text"            //此命令未使用重置,因此后续输入都将是红色
    重置=0
    黑色=30
    红色=31
    绿色=32
    黄色=33
    蓝色=34
    粉色=35
    青色=36
    白色=37

    \e[1;31m        //1表示为文本显示类型
    1=粗体
    4=下划线
    5=闪烁
    7=背景色

    # echo -n "123"
    # echo "456"
    # echo -n "123" && echo "456"            //n为不换行输出,


8) 括号符号:[ ]
有包含a、b、c的行
[root@pillar1m ~]# grep "[abc]" test.txt
    匹配多个字符信息
    [root@pillar1m ~]# grep "h[a-z]p" ~/test.txt      

   作业:将以I开头和m开头的行都找出来
# grep "^[Im]" test.txt


9) 括号和尖号组合 [^]
排除符号,除了a、b、c外,匹配包含其他字符的行:
   [root@pillar1m ~]# grep -v "[abc]" test.txt
              grep "[^abc]" test.txt


扩展正则符号:
默认 grep sed不能直接识别
grep 提升自己  -- egrep/grep -E
sed  提升自己  -- sed -r
1) +号符号:
匹配前一个字符连续出现了1次或者多次    
[root@pillar1m ~]# grep "0*" test.txt
[root@pillar1m ~]# egrep "0+" test.txt -o

cat >> ~/test02.txt<<EOF

张三 123456
李四 123457
王五 abcdef
王五1 def123
赵六 123459
EOF

找出qq信息输入错误的内容
[root@pillar1m ~]# grep [0-9] test02.txt

[root@pillar1m ~]# grep -E "[0-9]+" test02.txt

[root@pillar1m ~]# grep -E "[0-9]+" test02.txt -o

[root@pillar1m ~]# grep -Ev "[0-9]+" test02.txt
王五   abcdef

作业:通过[]筛选出不包含#号和;号开头的行
# grep -v "^[#;]" /etc/ssh/ssh_config

2) 竖线符号:|  
或者符号,用于匹配多个信息
[root@pillar1m ~]# grep -E "my|0" test.txt

只查找当前系统中张三和root的用户信息:
# grep -E "^zhangsan|^root" /etc/passwd

3) 括号符号: ()
作用:
1. 指定信息进行整体匹配
[root@pillar1m ~]# grep -E "(my)" test.txt

2. 进行后项引用前项使用: sed命令替换功能
批量创建用户 test01..test10
[root@pillar1m ~]# echo test{01..10}
   [root@pillar1m ~]# echo test{01..10} | xargs -n1
第一种方式:
[root@pillar1m ~]# echo test{11..12} | xargs -n1 useradd
第二种方式:
    [root@pillar1m ~]# echo test{01..10} | xargs -n1 | sed -r 's#(.*)#useradd \1#g'

    [root@pillar1m ~]# echo test{01..10}|xargs -n1|sed -r 's#(.*)#useradd \1#g' | bash


企业面试题: 批量创建用户 test01..test10,并给每个用户设置密码信息,默认初始化密码(123456)
01. 如何创建用户 给用户设置密码
02. 基础命令 echo {}/seq -w 10
03. sed命令替换信息方法
04. 正则符号 .* ()
05. 基础符号 ; |
06. bash内置命令
[root@pillar1m ~]# seq -w 10 | sed -r 's#(.*)#useradd test\1;echo 123456 | passwd --stdin test\1#g'
         # echo abc{01..10} | xargs -n1 | sed -r 's#(.*)#useradd \1;echo \1| passwd --stdin \1 #g'

将输出的信息
echo 123456 ==> 转换为 <123456>进行显示
    [root@pillar1m ~]# echo 123456|sed -r 's#(.*)#123<\1>#g'
    <123456>

()符号扩展:

只对数字内容增加括号显示:

cat >>~/test03.txt<<EOF

123456
88888
abcde
中文
语言
EOF
# cat ~/test03.txt | sed -r 's#([0-9]+)#<\1>#g'

echo 123456 ==> 转换为 <12><34><56>进行显示
[root@pillar1m ~]# echo 123456 ==> 转换为 <12><34><56>进行显示
[root@pillar1m ~]# echo 123456
123456
[root@pillar1m ~]# echo 123456 | sed -r "s#(12)(34)(56)#<\1><\2><\3>#g"
[root@pillar1m ~]# echo 123456 | sed -r "s#(12)(34)(56)#<\1><><\3>#g"
[root@pillar1m ~]# cat test03.txt | sed -r "s#(..)(..)(..)#<\1><\2><\3>#g"
[root@pillar1m ~]# echo 123456 | sed -r "s#(12)(34)(56)#<\1><\3><\3>#g"


4) 括号符号:{}
可以指定字符连续匹配的次数
第一种情况: x{n,m}  表示前一个字符至少连续出现n次,最多出现m次
[root@pillar1m ~]# grep -E "0{2,3}" test.txt

[root@pillar1m ~]# grep "0+" test.txt
[root@pillar1m ~]# grep -E "0+" test.txt

第二种情况: x{n} 表示前一个字符正好连续出现了n次
[root@pillar1m ~]# grep -E "0{2}" test.txt

[root@pillar1m ~]# grep -E "0{2}" test.txt -o

第三种情况: x{n,} 表示前一个字符至少连续出现n次,最多出现多少次不限
[root@pillar1m ~]# grep -E "0{2,}" test.txt

    [root@pillar1m ~]# grep -E "0{2,}" test.txt -o

第四种情况: x{,m} 表示前一个字符至少连续出现0次,最多出现m次
[root@pillar1m ~]# grep -E "0{,2}" test.txt

5) 问号符号 ?
   定义匹配前一个字符出现0或者1次

创建一个测试环境:

cat >>test04.txt<<EOF
gd
god
good
goood
gooood
EOF

[root@pillar1m ~]# grep "o*" test04.txt
gd
god
good
goood
gooood
[root@pillar1m ~]# egrep "o+" test04.txt
god
good
goood
gooood

[root@pillar1m ~]# egrep "o?" test04.txt
gd
god
good
goood
gooood
[root@pillar1m ~]# egrep "o?" test04.txt -o
o
o
o
o
o
o
o
o
o
o
[root@pillar1m ~]# egrep "o+" test04.txt -o
o
oo
ooo
oooo

补充: 想让grep sed命令可以直接识别扩展正则
[root@pillar1m ~]# grep "o\+" test04.txt
god
good
goood
gooood
[root@pillar1m ~]# grep -E "0{,2}" test.txt
[root@pillar1m ~]# echo 123456 | sed  "s#..

.
.
..
.
.
..
.
.

<\1><\2><\3>#g"

<12><34><56>

总结:
*  匹配前一个字符出现0次或者多次
+  匹配前一个字符出现1次或者多次
{} 匹配前一个字符指定出现多少次,至少0次
?  匹配前一个字符出现0次或者1次
.*
作业:利用ifconfig ens32只把IP地址信息显示出来
# ifconfig ens32

ifconfig ens33 | grep -E "[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}" -o | head -1

[root@pillar1m ~]# ifconfig ens32 | egrep "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+"
[root@pillar1m ~]# ifconfig ens32 | egrep "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" -o | head -1