文字の編集・処理

カーソルの移動

表示

挿入・貼り付け

削除

テキスト検索(grep

指定した正規表現を含む(若しくは含まない)行のみを出力する。grepの代わりにegrepを使用するとパターンを拡張正規表現で解釈する。正規表現ページも参照のこと。

grep オプション 正規表現パターン ファイル名
egrep オプション 拡張正規表現パターン ファイル名
-v
指定した文字列パターンを含まない行を表示する
-n
行番号を付けて表示する
-l
パターンに一致した内容は表示せず、ファイル名だけを表示する
-i
大文字小文字を区別しない
-A 数値
--after-context=数値
一致行の後続の行も数値行分だけ合わせて出力する
-B 数値
--before-context=数値
一致行の直前の行も数値行分だけ合わせて出力する
-C 数値
--context=数値
一致行の前後の行も数値行分だけ合わせて出力する(数値を指定しない場合の既定値は2)
-d 動作
--directories 動作
入力ファイルがディレクトリであった場合、動作に指定した方法で処理する。指定できる値と動作内容は以下の通り。既定の動作は「read」。
read
ディレクトリは通常のファイルと同じように読み取られる。
skip
ディレクトリは黙って無視される。
recurse
指定ディレクトリ配下に存在する全てのファイルを読み取る。この指定は-rオプションを指定するのと同じ。
-e 正規表現
--regexp=正規表現
正規表現を単純文字列ではなく正規表現パターンとして扱う。-(ハイフン)で始まるパターン等を正規表現として認識させるのに有効。
-E
--extend-regexp
拡張正規表現を有効にする(これがないと基本正規表現しか使えない)。egrepコマンドを使うのと同じ。grep -EZzegrepと同じ。
-o
--only-matching
パターンにマッチした行全体を出力するのではなく、パターンにマッチした部分のみを出力する。
-R
-r
--recursive
指定ディレクトリ配下に存在する全てのファイルを読む。-d recurseオプションを指定するのと同じ。
-Z、--decompress
指定ファイル(gzip圧縮されたもの)を解凍してから検索を始める。zgrepコマンドを使うのと同じ。grep -EZzegrepと同じ。

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)

【書式】
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)

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 区切り文字
入力文字列の区切り文字として区切り文字を使う(この値は規定定数FSに設定されている。指定がない場合の既定値は空白、)。
-f プログラムファイル名
--file プログラムファイル名
AWKプログラムソースを、コマンドラインの第1引数から読まず、プログラムファイル名から読む。複数の-f(または--fileオプションを指定可能)
-v 変数名=
--assign 変数名=
プログラム実行開始前に、変数変数名の値をに設定する。AWKプログラムを記す場合はBEGENブロックに記す。
AWKプログラムについて
コマンド 内容と例
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
`print $'
$0 は行全体、$1 は行コンテンツを空白で区切った最初の部分、$2 は2番目の部分...

参考文献・サイト

指定文字列で区切った文字列の切り出し(cut)

cutは指定文字列(ファイル)の各行から文字列の一部を切り出して返す。パイプを使えば他のコマンドの出力結果文字列などを処理することも可能。

【書式】バイト単位で切り出し位置指定
cut -b バイト数 -n ファイル名
【書式】文字単位で切り出し位置指定
cut -c 文字数 -n ファイル名
【書式】区切り文字で切り出し部分を指定
cut -f カラム番号 -d 区切り文字 -s -n ファイル名
-b バイト数
-c 文字数
-f カラム番号
切り出す範囲を指定する。単一の数値(先頭が1)、コンマ区切りによる複数指定(例:1,3)、ハイフンを使った範囲指定(例:1-3)が可能。なお、範囲指定で開始位置を指定しない場合は先頭から(例:-3)、終了位置を指定しない場合は最後まで(例:3-)を意味する。
-n
マルチバイト文字列を分割しない。このオプションを指定すると、マルチバイト文字は最後の1バイトが選択されている場合にのみ出力対象になる。
-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 オプション 対象文字列 置換文字列
【書式】ヘルプ表示
tr --help
【書式】バージョン表示
tr --version

オプション

-d
--delete
対象文字列に指定した文字列を削除する。このオプションを指定した場合、第2引数(置換文字列)は指定しない(指定するとエラーになる)。
【例】
$ 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