今さら聞けない検索

Linuxはファイル名を探すのが大変という印象がありますが、いくつかのコマンドを抑えておけば、そんなに面倒でもないです。

 

ファイルの中の文字列を検索

馴染みのないファイルを検索するのも何なんで、前にも何度となく取り上げているネットワークのconfigファイルからIPを確認したりするときなんかはgrepが便利だったりします。

 

構文:grep 検索文字列 ファイル名

[root@host1 ~]# grep IPAD /etc/sysconfig/network-scripts/ifcfg-eth1
IPADDR=192.168.0.251
[root@host1 ~]#

 

小文字も大文字も関係なしに検出したいときは、-iオプションを付けます。

[root@host1 ~]# grep -i ipad /etc/sysconfig/network-scripts/ifcfg-eth1
IPADDR=192.168.0.251
[root@host1 ~]#

 

ディレクトリ内のすべてのファイルのIPを確認したいときは、ファイル名のところに*(ワイルドカード)を入れます。


[root@host1 ~]# grep IPAD /etc/sysconfig/network-scripts/*
/etc/sysconfig/network-scripts/ifcfg-eth1:IPADDR=192.168.0.251
/etc/sysconfig/network-scripts/ifcfg-lo:IPADDR=127.0.0.1
:

また出力結果から行を抽出することもできますので、コマンドのあとに|(パイプ)でgrepをつなぐことで、同じ出力結果を表示できます。

[root@host1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1 |grep IPAD
IPADDR=192.168.0.251

どこにConfigファイルが有るかわからない場合でも、-rオプションを付けると、ディレクトリを掘り下げて(再帰的に)検索してくれたりします。(力技ですが。)


[root@host1 ~]# grep -r IPADDR /etc
/etc/ppp/ip-up.ipv6to4: ipv4addr="$IPADDR"
/etc/sysconfig/network-scripts/ifcfg-lo:IPADDR=127.0.0.1
/etc/sysconfig/network-scripts/ifdown-ipv6: ipv4addrlocal="$IPADDR"
/etc/sysconfig/network-scripts/ifdown-ipv6: ipv4addr="$IPADDR"

 

 

2つの文字列を組み合わせて検索

2つの文字列を組み合わせて検索するときは、egrepコマンドを使います。

まず、ORで検索するときは、’(クォーテーション)で囲んで、文字列の区切りに|(パイプ)を入れます。

[root@host1 ~]# egrep 'IPAD|DNS' /etc/sysconfig/network-scripts/ifcfg-eth1
DNS1=192.168.0.1
IPADDR=192.168.0.251
IPV6_PEERDNS=yes
[root@host1 ~]#

 

grepでも-Eオプションで同じ結果を出力できます。

[root@host1 ~]# grep -E 'IPAD|DNS' /etc/sysconfig/network-scripts/ifcfg-eth1
DNS1=192.168.0.1
IPADDR=192.168.0.251
IPV6_PEERDNS=yes
[root@host1 ~]#

 

ANDで検索するときは、’(クォーテーション)で囲んで、文字列の区切りに.*(ドットとアスター)を入れます。

 
[root@host1 ~]# egrep '192.*168' /etc/sysconfig/network-scripts/*
/etc/sysconfig/network-scripts/ifcfg-eth1:DNS1=192.168.0.1
/etc/sysconfig/network-scripts/ifcfg-eth1:IPADDR=192.168.0.251
/etc/sysconfig/network-scripts/ifcfg-eth1:GATEWAY=192.168.0.1
:

 

ファイル名に含まれる文字列で検索したいとき

王道としてはfindコマンドですが、一番シンプルな使い方は、find コマンドのあとにディレクトリを指定すれば、配下のファイルとディレクトリを全部表示してくれます。


[root@host1 ~]# find ./
./
./.bash_logout
./.bash_profile
./.bashrc
./.cshrc
./.tcshrc
:

ただ、findはいろいろとできるので、オプションをつけないとなんでも出てきてしまうというのと、対象のファイル名をきっちり覚えていないと行けないのが面倒です。もちろん*(ワイルドカード)をつけて検索も可能ですが、なにかとお作法にうるさい印象があります。

 

例えば、このようにキーワードの指定だけだと拾ってくれませんので、

[root@host1 ~]# find /etc/sysconfig/network-scripts/ -name ifcfg
[root@host1 ~]#

きっちり*(ワイルドカード)をつけてあげます。

[root@host1 ~]# find /etc/sysconfig/network-scripts/ -name ifcfg-*
/etc/sysconfig/network-scripts/ifcfg-lo
/etc/sysconfig/network-scripts/ifcfg-ens192
/etc/sysconfig/network-scripts/ifcfg-eth1
[root@host1 ~]#

 

ただ、ファイル名をウル覚えの場合でも、grepとの合わせ技だとキーワードの指定だけでも拾ってくれるので便利です。

 

[root@host1 ~]# find /etc/sysconfig/network-scripts/ |grep ifcfg
/etc/sysconfig/network-scripts/ifcfg-lo
/etc/sysconfig/network-scripts/ifcfg-ens192
/etc/sysconfig/network-scripts/ifcfg-eth1
[root@host1 ~]#

:

 

 おわり。。