bash awk sed grep 備忘録

CLASSPATH=
for name in `ls lib/*.jar`; do
  CLASSPATH="${CLASSPATH}:$name"
done

echo ${CLASSPATH}
  • 重複削除
#!/bin/bash

numLine=0
cat work.log | while read line
do
    numLine=$((numLine + 1))
    if [ `expr $numLine % 2` == 0 ]; then
        echo $line
    fi
done
  • ループしてファイル処理
#!/bin/bash                                                                                                                                                                                                                                                                     

for DIR in `ls`
do
    cd ${DIR}
    for FILE in `ls`
    do
        cat ${FILE} | while IFS= read -r line || [ -n "$line" ];
        do
            if [[ $line == "  <type>REPOSITORY</type>" ]]; then
                echo "$line" >> ${FILE}.new
                echo "  <namespace>"${DIR}"</namespace>" >> ${FILE}.new
            else
                echo "$line" >> ${FILE}.new
            fi
        done
        mv ${FILE}.new ${FILE}
    done
    cd ..
done

echo "convert finished"
#!/usr/bin/bash

FILE=/xxx/examples.txt

cd kogito-examples

for DIR in `ls`
do
    EXISTS=0
    while IFS= read -r line || [ -n "$line" ];
    do
        if [[ ${DIR} = ${line} ]]; then
            echo "hit ${DIR}"
            EXISTS=1
        fi
    done < <(cat ${FILE})
    if [[ ${EXISTS} = 0 ]] && [[ -d ${DIR} ]]; then
        echo "not hit ${DIR}"
        rm -rf ${DIR}
    fi
done

echo "finished"
  • ~/.2/repository から特定のバージョン全部削除
findg 7.50.0.Final | xargs rm
  • ファイルにコード挿入とか
#!/bin/bash

FILE=$1

if [ ! -f ./$FILE ]; then
    echo "The file doesn't exist!"
    exit
fi

CLASSNAME=${FILE:0:-5}

result=`grep -n "public class " $FILE`

marker=`echo $result | awk -F':' '{print $1}'`

echo $marker

count=0

echo -n > $FILE.new

cat ${FILE} | while IFS= read -r line || [ -n "$line" ];
do
    count=$((count + 1))
    if [[ $count == $(($marker-1)) ]]; then
        echo "$line" >> ${FILE}.new
        echo "@RunWith(Parameterized.class)" >> ${FILE}.new
    elif [[ $count == $(($marker+1)) ]]; then
        echo "" >> ${FILE}.new
        echo "    private final KieBaseTestConfiguration kieBaseTestConfiguration;" >> ${FILE}.new
        echo "" >> ${FILE}.new
        echo "    public $CLASSNAME(final KieBaseTestConfiguration kieBaseTestConfiguration) {" >> ${FILE}.new
        echo "        this.kieBaseTestConfiguration = kieBaseTestConfiguration;" >> ${FILE}.new
        echo "    }" >> ${FILE}.new
        echo "" >> ${FILE}.new
        echo "    @Parameterized.Parameters(name = \"KieBase type={0}\")" >> ${FILE}.new
        echo "    public static Collection<Object[]> getParameters() {" >> ${FILE}.new
        echo "        return TestParametersUtil.getKieBaseCloudConfigurations(true);" >> ${FILE}.new
        echo "    }" >> ${FILE}.new
        echo "$line" >> ${FILE}.new
    else
        echo "$line" >> ${FILE}.new
    fi
done

mv ${FILE}.new ${FILE}
  • 単語を時間帯毎にカウント
grep "login for:" server.log_cm* | sort | awk '{print $2}' | awk -F: '{print $1":"$2}' | sort | uniq -c
  • 複数ログを grep してファイル名を無視してソート
find . | grep server.log | xargs grep "Added user" | awk '{print $2 " " $3 " " $4 " " $5 " " $6 " " $7 " " $8 " " $9}' | sort
  • Full GC 後の footprint を見る
grep Full gc.log | grep -v Ergonomics | awk -F'[>(]' '{print $8}'

とか

grep Full gc.log | grep -v "Metadata GC Threshold" | awk -F' ' '{print $10}' | awk -F'[>(]' '{print $2}'

TODO: Ergonomics と System.gc と Metadata GC Threshold に全部対応するやつ

awk -F'\\[|\\]' '{print $4,$6}'
  • ファイルをリスト、あとで diff
ls -l | awk '{print $9}' > list.txt
ls -l | awk '{print $9}' | sed -e 's/\(.*\)-6.0.*jar/\1/' > list.txt

sed

  • 後方参照
    • cat xxx.txt | sed -e 's/<.*>\(.*\)<.*>/\1/g'
  • 直接編集&バックアップ(-i[SUFFIX])
  • タイムスタンプから ,XXX000000 を削る
sed s/,...000000//g
  • 複数ファイルを置換編集
find . -name *.java | xargs sed -i 's/org.kie.addons.monitoring/org.kie.kogito.monitoring/'

cat と 標準入力組み合わせ

echo "xxx" | cat - test.txt

grep でヒットした行の周りの複数行も見たい

find . | grep pom.xml | xargs grep -2 drools-mvel 2>/dev/null