1. ホーム
  2. スクリプト・コラム
  3. リナックスシェル

シェルとsedとawkの正規表現に関するFAQ

2022-01-05 14:47:03

1 正規表現の「+」「?」「*」は何を意味するのですか?

この3文字は、キーワードのマッチング数を制限するためのもので、それぞれ次のような意味を持っています。

  • +例:a+はa、aa、aaaなどにマッチします。
  • 例えば、a?は0個または1個のaにマッチします。
  • *例えば、a* は、ゼロまたは連続する任意の数の a にマッチします。

2 11桁の電話番号にマッチする正規表現はどのように書けばよいのですか?

Prepare the test file.
[root@svr5 ~]# cat tel.txt 
01012315
137012345678
13401234567
10086
18966677788
To extract the line containing the 11-digit phone number.
[root@svr5 ~]# egrep '^1[0-9]{10}$' tel.txt 
13401234567
18966677788


3 sed addresserの役割とその表現方法を簡単に説明する。

何をするのか アドレス文字(命令の実行条件)は、sedがテキストを処理する必要がある範囲を制御します。アドレス文字がない場合、すべての行が一行ずつ処理されます
表現方法:アドレス文字には行番号や正規表現を使用することができる

4 sedを使ってテキスト中の偶数行を抽出するには?

テストテキストを表示するには

[root@svr5 ~]# cat -n /etc/rc.local 
     1 #! /bin/sh
     2 #
     3 # This script will be executed *after* all the other init scripts.
     4 # You can put your own initialization stuff in here if you don't
     5 # want to do the full Sys V style init stuff.
     6 # touch /var/lock/sub
     7 touch /var/lock/subsys/local


偶数行を抽出することとその効果。

[root@svr5 ~]# cat -n /etc/rc.local | sed -n '2~2p'
     2 #
     4 # You can put your own initialization stuff in here if you don't
     6


5 sedを使って、各行の4文字目を削除するにはどうしたらいいですか?

テストテキストを表示するには

[root@svr5 ~]# cat /etc/rc.local 
#! /bin/sh
/bin/sh
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
touch /var/lock/subsys/local


各行の4文字目と効果を削除する場合。

[root@svr5 ~]# cat /etc/rc.local | sed 's/. //4'
#! /in/sh
#
# Tis script will be executed *after* all the other init scripts.
# Yu can put your own initialization stuff in here if you don't
# wnt to do the full Sys V style init stuff.
touh /var/lock/subsys/local


6 /etc/passwdファイルの6~10行目を抜き出し、pass5.txtファイルとして保存します。

テキストを抽出またはエクスポートします。

[root@svr5 ~]# sed -n '6,10p' /etc/passwd > pass5.txt


抽出結果を確認する。

[root@svr5 ~]# cat pass5.txt 
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin


7 awk ツールの基本的な構文形式を簡単に説明できる。

書式 1: awk [option] '[condition] {process action}' ファイル一覧表
フォーマット 2: コマンド | awk [option] '[condition] {process action}'

8 awk ツールでよく使われる組み込み変数と、それぞれが何をするのかを簡単に説明してください。

  • n:すなわち、指定された区切りの最初のフィールドのための$1、$2、$3 ......。
  • 0:現在読み込んでいるテキスト行全体を保持する
  • NF:現在の処理行のフィールド(列)の数を記録する
  • NR:現在読み込んでいる行数(行数)を記録します。

9 awk がテキストを処理するとき、ファイルを読む前、ファイルの内容を読んでいる最中、そしてファイルを読んだ後の 3 つのリンクはどのように表現されますか?

  • BEGIN{ } ファイルの前処理: awk が行を読み込む前に実行する動作。一般にデータを初期化し、単独で使用することもできます。
  • { } 行処理。awk が読み込んだ各行を処理します、個別に使用可能です。
  • END { } ファイル後処理: awk がすべての行を処理した後に実行される動作で、一般にデータ処理の結果を出力します。別途使用可能。

10 現在のeth0 NICのIPv4アドレスとマスク情報を抽出します。

テストテキストを表示します。

[root@svr5 ~]# ip add list eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:64:88:8e brd ff:ff:ff:ff:ff:ff:ff
    inet 192.168.4.55/24 brd 192.168.4.255 scope global eth0
    inet 192.168.4.5/24 brd 192.168.4.255 scope global secondary eth0
    inet6 fe80::20c:29ff:fe64:888e/64 scope link 
       valid_lft forever preferred_lft forever


IPv4 アドレスとマスク情報を抽出する動作と効果。

[root@svr5 ~]# ip add list eth0 | awk '/\<inet\>/{print $2}'
192.168.4.55/24
192.168.4.5/24


11 UIDが10~20のユーザーを検索し、ユーザー名と対応するUIDを出力する。

[root@svr5 ~]# awk -F: '$3>=10 && $3<=20{print $1":"$3}' /etc/passwd
uucp:10
operator:11
games:12
gopher:13
ftp:14


12 awkツールでbashをインタプリタとして使用しているユーザー数をカウントする。

NF 組み込み変数を使って、bash にマッチする最後の列を探し、x+1:を得る。

[root@svr5 ~]# awk -F/ '$NF=="bash"{x++}END{print x}' /etc/passwd


13 awk で配列を使うことは可能ですか、またそれぞれどのような構成になっていますか?

配列名、添え字、値の3つの部分からなる配列を使用することができる

14 linuxでテキストをソートする方法は?

sortコマンドを使用する。例:abc.txt テキスト
n:番号の昇順で並べ替え -k:指定した列で並べ替え -r:逆順で並べ替え

[root@svr5 ~]# sort -n abc.txt


この記事はシェルの正規表現とsedとawkのFAQについてです。シェルの正規表現とsedとawkの関連コンテンツはScript Houseの過去の記事を検索するか、以下の関連記事を引き続き閲覧してください 今後ともScript Houseをよろしくお願いします