指定した正規表現を含む(若しくは含まない)行のみを出力する。grep
の代わりにegrep
を使用するとパターンを拡張正規表現で解釈する。正規表現ページも参照のこと。
grep オプション 正規表現パターン ファイル名 egrep オプション 拡張正規表現パターン ファイル名
-r
オプションを指定するのと同じ。
egrep
コマンドを使うのと同じ。grep -EZ
はzegrep
と同じ。-d recurse
オプションを指定するのと同じ。zgrep
コマンドを使うのと同じ。grep -EZ
はzegrep
と同じ。patternについては、正規表現参照のこと。
【例】ファイル名に「mom」+「数字」を含み、ファイルの末尾がhtmlであるものの一覧
$ ls *.html | grep mom[0-9]
【例】ファイル「sshd_config
」から「PubkeyAuthentication」または「AuthorizedKeysFile」を含む行を抽出
$ grep '\(PubkeyAuthentication\|AuthorizedKeysFile\)' sshd_config
パターンをダブルクォート(")で囲んだとき、パターン内の変数は実際の定義されている値に置き換えられる。シングルクォート(')で囲むとその処理は行われず、変数は変数名そのままとなる。
$ cat test.sh #!/bin/bash KOTOSHI=`date "+%Y年"` STR="2019年:令和元年\n2018年:平成30年\n2017年:平成29年" echo 'ダブルクォート(")' echo -e $STR | grep "$KOTOSHI" echo "シングルクォート(')" echo -e $STR | grep '$KOTOSHI' $ bash test.sh ダブルクォート(") 2019年:令和元年 ←「2019年」というパターンにヒット シングルクォート(')←「$KOTOSHI」というパターンにはいずれもヒットせず 【例】テキストファイルから空行(改行だけの行)を除去5 $ grep -e -v '^$' sample.txt
参考サイト:
【書式】 sed -e "s/検索パターン/置換パターン/修飾子/"
【例1】ファイル名から上位パス名部分を削除してファイル名だけを配列変数に格納し表示 $ cat test1.sh #!/bin/sh FILES=(`ls /var/www/html/images/*.jpg`) for FILE in ${FILES[*]} do echo $FILE | sed -e 's/^.*\/images\/\(.*\)$/\1/' done echo ${files[*]} $ ls /var/www/html/images/*.jpg /var/www/html/images/image01.jpg /var/www/html/images/image02.jpg /var/www/html/images/image03.jpg $ ./test1.sh image01.jpg image02.jpg image03.jpg 【例2】ファイル名の一部を取り出し $ cat test2.sh #!/bin/sh ls -l main_*.xml | sed -e 's/main_\(.\{5\}\)\.xml/\1/' $ ls main_*.xml main_1a0hA.xml $ ./test2.sh 1a0hA
正規表現については正規表現ページも参照のこと。
制御文字を検索パターンに入力する場合、「Ctrl + v」+「Ctrl + ○」と入力する。○はキャラクターコードに対応する順序に位置するアルファベット? CR(13)の場合 「Ctrl + v」+「Ctrl + M」となる。
Windows上(改行はCR+LF)で作成されたテキストファイルなどをLinux(改行はLF)で開くと、テキスト上のCRに相当する位置に「^M」が表示される。これを除去するにはsed -e 's/^M//g' some.txt
のようにする(^Mの部分はそのまま入力するのではなく、Ctrl+v + Ctrl+m で入力)1。
gawk
はAWKというプログラミング言語のGNUプロジェクト版。AWKは、POSIX 1003.2(コマンド言語AWKとユーティリティの標準について) の言語定義に従い実装されたもので、一方gawk
は、Aho, Kernighan, Weinbergerによって作られたAWKにUNIXのAWKコマンドの System V Release 4が持つ機能を追加したものになっています。更に最近のベル研究所によるAWK拡張や、多くのGNU特有の拡張も含んでいます。
指定したファイルの各行の一部切り出しなどの処理を行う。パイプを使えば他のコマンドの出力結果文字列などを処理することも可能。
【書式】 gawk POSIX または GNU のオプション -f プログラムファイル名 -- ファイル名 gawk POSIX または GNU のオプション -- プログラムテキスト ファイル名
-F 区切り文字
--field-separator 区切り文字
-f プログラムファイル名
--file プログラムファイル名
-f
(または--file
オプションを指定可能)
-v 変数名=値
--assign 変数名=値
コマンド | 内容と例 |
---|---|
print $数値 |
指定区切り文字で区切った数値番目の文字列を返す。
$ cat test.txt 1 H hydrogen 2 He helium 3 Li Lithium 4 Be berylium $ gawk '{print $2}' test.txt H He Li Be |
printf "書式指定",$数値 |
指定区切り文字で区切った数値番目の文字列を指定書式で返す。書式指定はprintfと同じ。
$ cat test.txt 1 H hydrogen 2 He helium 3 Li Lithium 4 Be berylium $ gawk '{printf "%s:",$1}{printf "%s\n",$2}' test.txt 1:H 2:He 3:Li 4:Be |
変数 | 既定値 | 内容 |
---|---|---|
FS | (空白文字) | 入力文字列の区切り文字 |
OFS | (空白文字) | 出力文字列の区切り文字 |
ORS | (改行) | 出力行の区切り文字 |
【書式】ファイル各行のn番目の要素を出力(空白を区切りとして) gawk '{print $n}' ファイル名 【例】 $ cat access_log 123.1.2.3 - - [25/May/2010:10:00:00 +0900] "GET /index.html HTTP/1.0" 200 345 "-" "Mozilla/5.0 ..." ... $ gawk '{print $4}' access_log [25/May/2010:10:00:00 ... 【例】 $ ls -l /var/named | grep 'hoge.zone$' # /var/named 配下で hoge.zone で終わるファイル名を持つファイル一覧を出力 -rw-r----- 1 named named 1824 7月 26 16:21 hoge.zone $ ls -l /var/named | grep 'hoge.zone$' | gawk '{print $3}' # 空白を区切りとして3つ目の内容だけを抽出 named $ ls -l /var/named | grep 'hoge.zone$' | gawk '{print $5}' # 空白を区切りとして5つ目の内容だけを抽出 1824 【例】 $ wc -l hoge.txt # hoge.txtの行数を得る→wc 120 hoge.txt $ wc -l hoge.txt | gawk '{print $1}' # 空白区切った1番目の値を取り出す 120
参考文献・サイト
cut
は指定文字列(ファイル)の各行から文字列の一部を切り出して返す。パイプを使えば他のコマンドの出力結果文字列などを処理することも可能。
【書式】バイト単位で切り出し位置指定 cut -b バイト数 -n ファイル名 【書式】文字単位で切り出し位置指定 cut -c 文字数 -n ファイル名 【書式】区切り文字で切り出し部分を指定 cut -f カラム番号 -d 区切り文字 -s -n ファイル名
-n
-d 区切り文字
-s
【例】4-7文字目を切り出す $ echo "pdb1ja5.ent.gz" | cut -c 4-7 1ja5 【例】"/" で区切った8番目の文字列を切り出す $ ls -l /var/www/html/stnavix/result/SN-16969/main_1a3wA.xml -rw-r--r-- 1 user user 1322 12月 14 13:54 /var/www/html/stnavix/result/SN-16969/main_1a3wA.xml $ ls -l /var/www/html/stnavix/result/SN-16969/main_1a3wA.xml | cut -d "/" -f8 main_1a3wA.xml 1:-rw-r--r-- 1 user user 1322 12月 14 13:54 2:var 3:www 4:html 5:stnavix 6:result 7:SN-16969 8:main_1a3wA.xml 【例】末尾1文字を取り出す $ str="aiueo";echo $str | cut -c ${#str} ${#変数名}で変数名に格納された文字列の文字数が得られる→文字列カウント o
要素数が不定でカラム番号などが指定が難しい場合、区切りを空白に変換すれば配列として受け取ることができる[3]
$ cat test.sh #!/bin/sh STR="red,blue,green,yellow" ARRAY=(`echo $STR | tr -s ',' ' '`) for ITEM in ${ARRAY[*]} do echo $ITEM | tr "[:lower:]" "[:upper:]";done done $ ./test.sh RED BLUE GREEN YELLOW
参考文献・サイト
【書式】 tr オプション 対象文字列 置換文字列 【書式】ヘルプ表示 tr --help 【書式】バージョン表示 tr --version
オプション
-d
--delete
【例】 $ echo "UPCASE LETTERS" | tr A-Z a-z upcase letters
参考文献・サイト
ある同一の文字列ではさんだ内容をcatに追記リダイレクトすると標準出力にはさまれた内容が出力される。それをさらにファイル名を指定してリダイレクトすると出力先をファイルに変えることもできる4
$ cat << EOS > This > is > a > pen > EOS This is a pen $ cat << EOS > test.txt > This > is > a > pen > EOS $ cat test.txt This is a pen