ls/cp 等で使える正規表現

ついつい忘れてしまう、ls等で使える正規表現いろいろ。

$ ls
dummy123.txt  dummyabc.txt.bak  test123.txt  testabc.txt

$ ls test*
test123.txt  testabc.txt

$ ls *{123,abc}*
dummy123.txt  dummyabc.txt.bak  test123.txt  testabc.txt

$ ls *{123,abc}.txt
dummy123.txt  test123.txt  testabc.txt

$ ls dummy{123}*
ls: dummy{123}*: No such file or directory
文字列を一つのみ指定するとエラー。「ls dummy123*」でいい訳だが。。。

$ ls dummy{qqq,www}*
ls: dummyqqq*: No such file or directory
ls: dummywww*: No such file or directory
マッチしないとマッチしない分、エラーが表示される。

$ ls test[0-9]*.txt
test123.txt

$ ls test[^0-9]*.txt
testabc.txt


{} は ,(カンマ)で区切られた文字列での一致。
[] は ,(カンマ)で区切られた1文字での一致、^(ハット)は排他。

シェルスクリプト(bash)の配列操作

HPの方に記載していたものをこちらに転載。

#!/bin/bash
POS=0
while read REC
do
    ARRAY[$POS]="$REC"
 
    echo ${ARRAY[$POS]}
 
    POS=`expr $POS + 1`
 
done < "/etc/passwd"
やってることは、/etc/passwdをcatしてるのと同じ。

簡単な操作ならシェルスクリプトでも可能だが、分割等をcatやawkでやるとその都度プロセスができるのでリソースの使い方が激しい。レンタルサーバなんかでバッチ処理をシェルで組むと、「Resource temporarily unavailable」が頻発したりする。
そんな時はスクリプト系言語で組むと解消される場合がある。

文字列編集(シェルスクリプト)

cutによる分割
echo "AAA,BBB,CCC" | cut -d"," -f 2

実行結果
BBB
echo "1234567890" | cut -b 2
echo "1234567890" | cut -b 2-4

実行結果
2
234
cutの最初の例は、[-d]でデリミタ(区切り文字)を指定し、[-f]で何個目の要素を出力するかを指定する方法です。
cutの2つめの例は、[-b]で出力する位置を指定する方法です。

cutによる文字列分割の欠点は、デリミタにシングルバイトしか指定できない点です(ひょっとしてあるかも)。awkを使用するとこの問題を解決できます。さらに、最後のフィールドを取得するのも簡単です。
awkによる分割
echo "AAA::BBB::CCC" | awk -F'::' '{print $2;}'

実行結果
BBB

最終フィールドの取得
$ which gmake
/usr/bin/gmake
$ which gmake | awk -F'/' '{print $NF}'
gmake
[-F]でデリミタを指定し[$2]で2番目の項目を出力しています。
ちなみに、'(シングルクォート)のエスケープは連続で。
$ echo "abc def" | awk -F' ' '{print "'\''"$1"'\'',";}'
'abc',


[続きを見る]

シェルスクリプトのパラメータ(引数)の取得

getopts を利用した、シェルスクリプトのパラメータ(引数)取得。

getopts の指定方法:
文字:valueあり
文字valueなし。ヘルプ表示やデバッグのフラグなどに利用。


#!/bin/sh

sub_show_usage () {
    echo "Usage: $0 [-d date] [-h]"
    echo "   -d: date (yyyymmdd) "
    echo "   -h: show usage "
    exit 1
}

while getopts d:he: OPT
do
  case $OPT in
    "d" ) DATE="$OPTARG" ;;
    "e" ) ENV="$OPTARG" ;;
    "h" ) sub_show_usage
          exit 1;;
     *  ) sub_show_usage
          exit 1 ;;
  esac
done

echo "*** DATE=[$DATE] ENV=[$ENV]"
exit 0


実行例:
$ ./tmp.sh -d 20100929 -h
Usage: ./tmp.sh [-d date] [-h]
   -d: date (yyyymmdd)
   -h: show usage
$ ./tmp.sh -d 20100929
*** DATE=[20100929] ENV=[]
$ ./tmp.sh -d 20100929 -e test
*** DATE=[20100929] ENV=[test]

メールヘッダーの設定

返信先、エラー時の設定など。

From:
Errors-To:
Reply-To:
Return-Path:

カテゴリ

Amazon

アクセスランキング

[ジャンルランキング]
コンピュータ
261位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
47位
アクセスランキングを見る>>

RSSリンクの表示

ブロとも申請フォーム

Copyright © nopgm