Linuxのインタビューの質問:一連の正規表現演習(1つの質問と複数のソリューション)

正規表現演習の選択

基本パーツ

  1. / proc / meminfoファイルで、サイズまたは小文字のsで始まるすべての行を検索します。少なくとも3つの方法があります。

    grep -E '^(s|S)' /proc/meminfo								//扩展模式
    grep -i '^s' /proc/meminfo									//忽略大小写
    sed -r -n '/^(s|S)/p' /proc/meninfo							//sed模式
    
  2. 現在のシステムのroot、centos、またはuser1ユーザーに関する情報を表示します

    cat /etc/passwd |grep -E '^(root|centos|user1)\>'//左边开头且右边是同类型字符
    
  3. /etc/rc.d/init.d/functionsファイルで、単語の後に括弧が続く行を見つけます。

    grep -P '\b\w*\b\(\)' /etc/rc.d/init.d/functions
    grep -E '\b([a-zA-Z]|_|[0-9])*\b\(\)' /etc/rc.d/init.d/functions
    grep -Eo "[_[:alnum:]]+\(\)"					//[:alnum:]字母和数字
    
  4. echoコマンドを使用して絶対パスを出力し、grepを使用してそのベース名(basename)を取得します

    echo /etc/rc.d/init.d/functions |grep -Po  '\b/\w*$'|grep -Po '\w*'
    echo /etc/sysconifg/network-srcipts/ifcfg-ens33 |grep -Eo "\<[^/]+/?$"
        //没有以/开头且没有以/结尾的字符串
    
  5. dirnameコマンドの結果と同様に、そのパス名を取り出します。

    1. ifconfigコマンドの結果で1〜255の値を見つけます。

    ifconfig | grep -P '\ b([0-9] | [1-9] [0-9] | 1 [0-9] [0-9] | 2 [0-4] [0-9] | 25 [0-5])\ b '

    
    2. 添加用户bash,testbash,basher以及nologin(其shell为/sbin/nologin);然后找出/etc/passwd文件用 户名同shell名的行
    
    ```c
    cat /etc/passwd |grep -E  '^(\w*):.*\1$'
    cat /etc/passwd |grep -E "^(\<.*\>):.*\1$"     //(???)  \1
    grep -E "^[^:]+\>"							//逆向思考
    grep -Eo "^([^:]+\>).*\1$"
    
    1. ifconfigでコマンドのIPアドレスを取得するには、3つの方法を使用します。
    方法一:
    ifconfig|grep -oE "inet [0-9.]+ "|awk '{print $2}'       //辅助awk
    方法二:
    ifconfig|grep -oP '(?<=inet )(.*)(?=netmask)'              //零宽断言
    方法三:
    //三类ip地址第一个字段范围:A:1-127;B:128-191;C:192-223,合并起来就是1-223,第二第三字段是0-255,最后一个字段是1-254
    ifconfig |grep -oP '\b([1-9]|[1-9][0-9]|1[0-9][0-9]|2[01][0-9]|22[0-3])\b\.(\b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b\.){2}\b([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\b'
    方法四:    
    ifconfig | grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}'   //简单粗暴有瑕疵
    方法五:
    ifconfig |grep -o '\b[0-9]\{1,3\}\b\.\b[0-9]\{1,3\}\b\.\b[0-9]\{1,3\}\b\.\b[0-9]\{1,3\}\b'							//简单无脑粗暴
    

上級部

  1. ディレクトリ内のすべての.phpおよび.htmlファイルで文字「main {}」のみを再帰的に検索します

    grep -r "main{}" . --include *.{
          
          php,html}
    
  2. 検索結果からすべてのREADMEファイルを除外する

    grep -r  "main{}" . --exclude "README"
    
  3. 検索結果からファイルリスト内のファイルを除外する

    grep -r "main{}" . --exclude-from filelist
    
  4. マルチレベルディレクトリ内のテキストの再帰検索

    grep -r -n -E '^(#!/bin/bash)' .   //. 指的是当前目录路径
    
  5. 複数のファイルを検索し、一致するテキストがどのファイルにあるかを見つける

    grep -n "root" /etc/fstab /etc/shadow /etc/passwd
    
  6. fstabの先頭で英語以外の行を検索し、行番号を表示します

    第一种:
    cat /etc/fstab|grep -nv '^[a-zA-Z]'	  //反向选择
    第二种:
    cat /etc/fstab |grep -n "^[^a-zA-Z]"  //反向选择
    
  7. fstabで、cの後に1、2 d、3の文字列が続く行を検索します。

    cat /etc/fstab|grep -E  'cd{1,2}3'
    
  8. 空白行と#で始まる行をフィルタリングする

#cat /etc/fstab|grep -vE '^$|^#'
  1. /etc/rc.d/rc.sysinitまたは/etc/grub.confファイルで、少なくとも1つの空白文字で始まり、その後に非空白文字がある行を見つけます。

    cat  /etc/grub2.cfg|grep -P '^(\s{1,})\S'
    cat  /etc/grub2.cfg|grep -P  '^\s+\S'
    
  2. システムのすべてのシステムユーザーを一覧表示する

    cat /etc/passwd |awk -F: '$3>=1 && $3 <=1000{print $1}'
    
  3. フィルタリング機能ファイルでは、単語または単語の前に「_」で始まる行が表示され、前後2行が表示されます

    grep -P -C 2 '^_?\b\w+\b' /etc/rc.d/init.d/functions
    grep -E2 "^[_[:alnum:]]+\\(\\)" /etc/rc.d/init.d/functions
    

上級部

  1. /etc/rc.d/rc.sysinitの#で始まる行を表示し、その後に1つ以上の空白文字、その後に空白以外の文字を表示します

    grep -P -n '^#\s+\S*' /etc/rc.d/rc.sysinit
    
  2. / proc / cpuinfoファイルでキーワードfl agsを検索し、前後の行を表示します

    grep -C 1 'flags' /proc/cpuinfo
    
  3. 少なくとも1つのルートキーワードを含むファイルを検索する

    //内容包含:  grep -P -r '(root)+' .
    find  . -type f  -print0| xargs -0 grep -c banana |grep -v ":0$"
    
  4. テキスト内のすべてのqqメールボックスを検索(詳細:すべてのメールボックスを検索)

    grep -P '^[1-9]{1}[0-9]{5,9}@qq.com' ./mail.txt
    
  5. / etcディレクトリでrootキーワードを含むすべてのファイルを検索し、ファイルパスとファイル名を表示します

    grep -l -r 'root' /etc | xargs ls -l
    
  6. ログファイルエラーを生成する行を監視し、エラーを含む行のみを出力します。

tailf -f /var/log/nginx/error.log |grep --line-buffer 'Error' //行缓冲:每更新一行就监控控一行

教室での練習

1. ipadd変数を定義します。この変数の内容はeth0ネットワークカードのIPであり、この変数がすべてのシェルで有効であることを要求します

ipadd=`ifconfig ens33 | grep 'inet.*netmask'|awk '{print $2}'
export ipadd

2.システム環境変数PATHの値を/ binに変更し、次にpasswdを実行して現在のユーザーのパスワードを変更します。成功しますか?

いいえ、passwdコマンドのファイルパスは/ usr / bin / passwdです。PATHパスが/ binに設定された後、passwdを直接実行すると、一致するパスが見つかりません。

3.現在のシステムの言語環境を中国語に変更します(すでに中国語の場合は英語に切り替えます)。これは永続的に有効になります

export LANG="zh_CN.UTF-8"

4.システム内で1k未満のファイルを見つけ、それらを/ var / tmp / find_dirにコピーし、バックグラウンドで実行する

mkdir -p /var/tmp/find_dir;find -size -1k -exec cp -a {
    
    } /var/tmp/find_fir \; > /dev/null &

5.システムのグループアカウントファイルをカウントし、それらのgidをソートして、ファイル〜/ gid.txtに出力し、出力行をカウントします

sort -t: -k3 -n /etc/group |tee ~/gid.txt |wc -l

6. sedを使用して〜/ install.logファイルを直接変更し、すべてのx86_64をi386に変更して、バックアップファイルを生成します。

 |sed -i.bak's/x86_64/i386/g' ~/install.log

おすすめ

転載: blog.csdn.net/weixin_31789689/article/details/107864016
おすすめ