zoukankan      html  css  js  c++  java
  • Linux03 重定向,管道,文件查找(grep)

    重定向(>、>>、&>、&>>、2>、2>>、<、 <<)

    计算机组成:

    运算器、控制器:CPU
    存储器:RAM
    输入设备/输出设备
    
    程序:指令和数据
    控制器:指令
    存储器:
    
    地址总线:内存寻址
    数据总线:传输数据
    控制总线:控制指令
    
    寄存器:CPU暂时存储器
    
    I/O:硬盘
        
    程序
    
    INPUT设备:
    
    OUTPUT设备:
    
    系统设定:
    	默认输出设备:标准输出,STDOUT,1
        默认输入设备,标准输入,STDIN,0
        标准储物输出:STDERR,2
    
    标准输入:键盘
    标准输出和错误输出:显示器
    
    I/O重定向:改变了数据的输入和输出的来源,这种操作就叫做重定向。对于Linux而言,输出重定向用‘>’,输入重定向用‘<’。
    
    # 输出重定向:
    >:使用一个>输出重定向,它会覆盖目标文件中原来的内容;这种叫做覆盖输出;
    >>:追加输出
    set -C:禁止对已经存在文件使用覆盖重定向;
    	强制覆盖输出,则使用 ‘ >| ’ 。
    set +C:关闭上述功能
    
    2>:重定向错误输出,正确输出仍然显示在屏幕上。
    2>>:追加方式重定向错误输出,正确输出仍然显示在屏幕上。
    
    同时定义标准输出和错误输出:
    	ls /varr > /tmp/var.out 2> /tmp/var.out  # 无论是正确输出还是错误输出,都不会显示在屏幕上,全部重定向到/tmp/var.out文件中去。
    
    &> : 重定向标准输出或错误输出至同一个文件(使用这一个符号就可以代替同时使用 >和2> 符号输出的结果。)
    &>>: 追加的方式重定向标准输出或错误输出至同一个文件
        ls /varr &>> /tmp/var.out  # 等价于 ls /varr > /tmp/var.out 2> /tmp/varr.out
        
    # 输入重定向
    <:输入重定向
    <<:Here Document(表示在此处生成文档)
    

    输出重定向:

    输入重定向:

    如何将标准输出即显示到屏幕又在文件中保存一份?

    tee: # read from standard input and write to standard output and files
        echo "Hello,World." | tr 'a-z' 'A-Z' | tee /tmp/hello.out  # 输出到屏幕的“hello ,world.”是tee完成的,这里可不是echo.
    

    管道

    管道:前一个命令的输出,作为后一个命令的输入。

    命令1 | 命令2 | 命令3 | ...
    
    echo "hello,world." | tr 'a-z' 'A-Z'
    echo "redhat" | passwd --stdin hive  # 修改当前用户登录密码
    echo cut -d: -fl /etc/passwd | sort | tr 'a-z' 'A-Z'
    wc -l /etc/passwd | cut -d' ' -f1    
    

    小练习:

    1. 统计/usr/bin/目录下的文件个数;
    # ls /usr/bin/ | wc -l
    2. 取出当前系统上所有用户的shell,要求:每种shell只显示一次,并且按顺序进行显示;
    # cut -d: -f7 /etc/passwd | sort | sort -u
    3. 思考:如何显示/var/log目录下每个文件的内容类型?
    # file /var/log/*
    4. 取出/etc/inittab文件的第6行;
    # head -6 /etc/inittab | tail -1
    5.取出/etc/passwd文件中倒数第9个用户名和shell,显示到屏幕上并将其保存至/tmp/users文件中;
    # tail -9 /etc/passwd | head -1 | cut -d: -f1,7 | tee /tmp/users
    6. 显示/etc目录下所有以pa开头的文件,并统计其个数;
    # ls -d /etc/pa* | wc -l
    7. 不使用文本编辑器,将alias cls=clear一行内容添加至当前用户的.bashrc文件中;
    echo "alias cls=clear" >> ~/.bashrc
    

    grep(Global Reseearch )

    grep:根据模式,搜索文本,并将符合模式的文本行显示到屏幕上来。只支持基本正则表达式定义的模式来过滤文本的命令。

    Pattern:由文本字符和正则表达式的元字符组合 而成匹配条件。

    grep [options] PATTERN [FILE...]

    基本正则表达式

    -i: # 表示在查找的时候忽略大小写
    --color: # 将要查找的内容,以高亮的方式显示出来
    -v: # 显示没有被模式匹配的行
    -o: # 只显示被模式匹配的串,行中的其他字符不显示
    
    # 扩展的表达式
    	-E:使用扩展正则表达式
    	-A(after) 数字:表示grep匹配到当前这一行,不仅显示当前这一行,还会显示当前行下面的几行(根据-A后面的数字决定显示几行)
        	eg:
                grep -A 2 '^core id' /proc/cpuinfo
    	-B(before):表示grep匹配到当前这一行,不仅显示当前这一行,还会显示当前行上面的几行(根据-A后面的数字决定显示几行)
    	-C(context):表示grep匹配到当前这一行,不仅显示当前这一行,还会显示当前行上面和下面的几行(根据-A后面的数字决定显示几行)
    
    
    正则表达式:REGular EXPression,REGEXP
    元字符:
    	.:匹配任意单个字符
    	[]:匹配指定范围内的任意单个字符
    	[^]:匹配指定范围外的任意单个字符
    		字符集合:[:digit:],[:lower:],[:upper:],[:punct:],[:space:],[:alpha:],[:alnum:]
        	eg:
                grep '[[:digit:]]$' /etc/inittab
    		   grep '[[:space:]][[:digit:]]$' /etc/inittab
    匹配次数(贪婪模式,尽量往多的个数匹配):
    *:匹配其前面的字符任意次
    	a,b,ab,aab,acb,adb,amnb
    	a*b:能匹配-->ab,aab
    	a.*b:这里的*匹配的是.  而.又代表任意字符,所以a.*b表示是匹配以a开头,b结尾,中间是任意个数的任意字符; -->ab,aab,acb,adb,amnb   # grep 'a.*b' test.txt
    
    .*:任意长度的任意字符
        
    ?:匹配其前面的字符1次或0次
    	a?b --> b,ab,aab,acb,adb,amnb  # grep 'a?b' test.txt
    
    {m,n}:前面加反斜杠的作用是转义,不加的话,会被bash识别为花括号展开;表示匹配其前面的字符至少m此,至多n次。
    	{1,}:表示至少1次;
         {1,3}:至少1次,最多3次
        	eg:
                grep 'a{1,3}b' test.txt  表示匹配a至少1次,对多3次
                grep 'a.{1,3}b' test.txt # 表示在a和b中间匹配任意字符至少1次,最多3次。 
    
    位置锚定:
    	^:锚定行首,此字符后面的任意内容必须出现在行首
            eg:
                grep '^r' /etc/inittab
    	$:锚定行尾,此字符前面的任意内容必须出现在行尾
        	eg:
            	grep 'w$' /etc/inittab
                grep '^r..h$' /etc/inittab
    
    	^$: 匹配空白行
            eg: 
                grep '^$' /etc/inittab | wc -l
    	<或: 其后面的任意字符必须作为单词首部出现
    	>或: 其前面的任意字符必须作为单词的尾部出现
            
    	<root>:表示root这个单词既不作为词首出现,也不作为词尾出现,必须作为整个单词出现。
    
    分组:
    ()
    (ab)*:表示ab可以匹配无数次
        eg:
            grep "(ab)*" test.txt
    	
        后向引用:
        	1:第一个左括号以及与之对应的右括号所包括的所有内容
    		2:第二个左括号以及与之对应的右括号所包括的所有内容
    		3:第三个左括号以及与之对应的右括号所包括的所有内容
                eg:
                    grep '(l..e).*1' test3.txt
                    grep '([0-9]).*1$' /etc/inittab
    

    :

    image-20210316005856532

    后向引用:

    扩展正则表达式:

    扩展正则表达式

    字符匹配(同基本正则表达式):
    	.
        []
        [^]
    次数匹配:
    	*:
    	?(不需要反斜杠了):
    	*:匹配其前面的字符至少一次
    	{m,n}:
    位置锚定:
    	^
    	$
    	<
    	>
    分组:
    	():分组
    	1,2,3,...
    	
    	或者
    	|:or
    	C|cat: Cat或cat,C或cat
    
    grep -E=egrep (扩展表达式)
        
    . : 如果匹配点本身,不让它匹配其前面任意单个字符,则可以在.前面加一个反斜杠,即".",这样就是匹配"."本身。
    
        
    fgrep:不支持正则表达式
    

    小练习:

    1. 显示所有以数字结尾且文件名中不包含空白的文件:
    ls *[^[:space:]]*[0-9]
    2. 找出/boot/grub/grub.conf文件中1-255之间的数字:
    <([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])>
    
    ifconfig | egrep --color '<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])>.<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])>.<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])>.<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])>'
    
    ifconfig | egrep --color '(<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])>.){3}<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])>'
    
    3. 匹配三类网址:
    	IPV4:
        	5类:A,B,C,D,E
    		A: 1-127
    		B: 128-191
    		C: 192-223
    
    ifconfig | egrep --color '/<([1-9]|[1-9][0-9]|1[0-9]{2}|2[01][0-9]|22[0-3])>(.<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4])>){2}.<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])>'
    
  • 相关阅读:
    LeetCode 791. 自定义字符串排序
    LeetCode 725. 分隔链表
    LeetCode 445. 两数相加 II
    LeetCode 354. 俄罗斯套娃信封问题
    LeetCode 338. 比特位计数
    LeetCode 318. 最大单词长度乘积
    LeetCode 300. 最长上升子序列
    蚂蚁金服研发面经
    Consul etcd ZooKeeper euerka 对比
    Java并发机制的底层实现原理之volatile应用,初学者误看!
  • 原文地址:https://www.cnblogs.com/zhangchaocoming/p/14543769.html
Copyright © 2011-2022 走看看