sed と awk （１）grep

今回から、新しいコースを始めたので、記録をとってみる。長年避けてきたsed / awk にチャレンジすることにする。正規表現も正直苦手だけど、ここをやると強くなれるかもしれない。

# grep

初回は grep(Global Regular Expression and Print) らしい。テキストのサーチのユーティリティ。STDIN を受け付けて、STDOUT に出力する。

# 使い道の例

* コンフィグレーションファイルをサーチする
* ハードウェアのドキュメントの生成。例えば サーバーの CPU のコア数など
* CSVのカタログデータを処理する

# サンプル

CPUのコア数を求める。

```bash
sysctl -a | grep machdep.cpu
machdep.cpu.max_basic: 22
machdep.cpu.max_ext: 2147483656
machdep.cpu.vendor: GenuineIntel
machdep.cpu.brand_string: Intel(R) Core(TM) i7-7567U CPU @ 3.50GHz
machdep.cpu.family: 6
machdep.cpu.model: 142
machdep.cpu.extmodel: 8
machdep.cpu.extfamily: 0
machdep.cpu.stepping: 9
machdep.cpu.feature_bits: 9221959987971750911
machdep.cpu.leaf7_feature_bits: 43804591
machdep.cpu.extfeature_bits: 1241984796928
machdep.cpu.signature: 526057
machdep.cpu.brand: 0
machdep.cpu.features: FPU VME DE PSE TSC MSR PAE MCE CX8 APIC SEP MTRR PGE MCA CMOV PAT PSE36 CLFSH DS ACPI MMX FXSR SSE SSE2 SS HTT TM PBE SSE3 PCLMULQDQ DTES64 MON DSCPL VMX EST TM2 SSSE3 FMA CX16 TPR PDCM SSE4.1 SSE4.2 x2APIC MOVBE POPCNT AES PCID XSAVE OSXSAVE SEGLIM64 TSCTMR AVX1.0 RDRAND F16C
machdep.cpu.leaf7_features: SMEP ERMS RDWRFSGS TSC_THREAD_OFFSET BMI1 AVX2 BMI2 INVPCID SMAP RDSEED ADX IPT SGX FPU_CSDS MPX CLFSOPT
machdep.cpu.extfeatures: SYSCALL XD 1GBPAGE EM64T LAHF LZCNT PREFETCHW RDTSCP TSCI
machdep.cpu.logical_per_package: 16
machdep.cpu.cores_per_package: 8
machdep.cpu.microcode_version: 142
machdep.cpu.processor_flag: 6
machdep.cpu.mwait.linesize_min: 64
machdep.cpu.mwait.linesize_max: 64
machdep.cpu.mwait.extensions: 3
machdep.cpu.mwait.sub_Cstates: 286531872
machdep.cpu.thermal.sensor: 1
machdep.cpu.thermal.dynamic_acceleration: 1
machdep.cpu.thermal.invariant_APIC_timer: 1
machdep.cpu.thermal.thresholds: 2
machdep.cpu.thermal.ACNT_MCNT: 1
machdep.cpu.thermal.core_power_limits: 1
machdep.cpu.thermal.fine_grain_clock_mod: 1
machdep.cpu.thermal.package_thermal_intr: 1
machdep.cpu.thermal.hardware_feedback: 0
machdep.cpu.thermal.energy_policy: 1
machdep.cpu.xsave.extended_state: 31 832 1088 0
machdep.cpu.xsave.extended_state1: 15 832 256 0
machdep.cpu.arch_perf.version: 4
machdep.cpu.arch_perf.number: 4
machdep.cpu.arch_perf.width: 48
machdep.cpu.arch_perf.events_number: 7
machdep.cpu.arch_perf.events: 0
machdep.cpu.arch_perf.fixed_number: 3
machdep.cpu.arch_perf.fixed_width: 48
machdep.cpu.cache.linesize: 64
machdep.cpu.cache.L2_associativity: 4
machdep.cpu.cache.size: 256
machdep.cpu.tlb.inst.large: 8
machdep.cpu.tlb.data.small: 64
machdep.cpu.tlb.data.small_level1: 64
machdep.cpu.address_bits.physical: 39
machdep.cpu.address_bits.virtual: 48
machdep.cpu.core_count: 2
machdep.cpu.thread_count: 4
machdep.cpu.tsc_ccc.numerator: 292
machdep.cpu.tsc_ccc.denominator: 2
```

のところを grep で検索する

```bash
$sysctl -a | grep machdep.cpu | grep core_count
machdep.cpu.core_count: 2
```
# サンプル２ pam

```bash
$grep pam_nologin /etc/pam.d/*
/etc/pam.d/login:account    required       pam_nologin.so
/etc/pam.d/login.term:account    required       pam_nologin.so
/etc/pam.d/sshd:account    required       pam_nologin.so
``` 
ちなみにPAMは、[Linuxの各アプリケーションが共通して利用する「PAM認証」について](https://oxynotes.com/?p=4393)に説明があった。設定がなされていて、これは、`pam_nologin` は、non-root ユーザがログインするのを防ぐモジュール。[6.23. pam_nologin - prevent non-root users from login](http://www.linux-pam.org/Linux-PAM-html/sag-pam_nologin.html)

# サンプル３　CSVのパース

'\e' はカラーを表示するエスケープシーケンス。最初のは黄色を示している。Macの場合は、bashのアップデートが必要になってくる。brew で入れたら/usr/local/binに入ったので、それを指定している。

_parse\_csv_

```bash
#!/usr/local/bin/bash
OLDIFS=$IFS; IFS=","

while read product price quantity
do
  echo -e "\e[1;33m$product =========\e[0m\n\
  Price : \t $price \n\
  Quantity : \t $quantity \n"

done < $1
IFS=$OLDIFS
```

_tools_

```
vocalbooth,5000,1
drill,99,5
hammer,10,50
bible,50,100
lamp,10,10
screwdriver,5,23
table-saw,1099,3
```

## 結果

ポイントは、`-A2` フラグで、これは、ヒットした行からさらに２行取得する。

```bash
$parse_csv tools | grep -A2 hammer
hammer =========
  Price : 	 10
  Quantity : 	 50
```
ちなみに、次のalias をかくと、grep のキーワードが赤くなる。残念ながら、わからないと思うが、実際の画面は、hammer のところが赤くなっている。

```bash
$alias grep='grep --color=auto'
$parse_csv tools | grep -A2 hammer
hammer =========
  Price : 	 10
  Quantity : 	 50
```

## 各種オプション

### 該当行からさらに２行取得

```bash
$parse_csv tools | grep -A2 hammer
hammer =========
  Price : 	 10
  Quantity : 	 50
```

### 該当行より２行前取得

```bash
$parse_csv tools | grep -B2 hammer
  Quantity : 	 5
hammer =========
```

### コンテキスト。該当行の前後二行

```bash
$parse_csv tools | grep -C2 hammer
  Quantity : 	 5

hammer =========
  Price : 	 10
  Quantity : 	 50
```

### ケースセンシティブではなくす

```bash
$parse_csv tools | grep -iC2 Hammer
  Quantity : 	 5

hammer =========
  Price : 	 10
  Quantity : 	 50
$parse_csv tools | grep -C2 Hammer
$
```