2020/08/22

ワンライナー

sh


for文をワンライナーで記載した例
$ for i in a b c d e ; do echo $i ; done

バッククォートで標準出力を渡す例
$ for i in `ls /tmp` ; do echo $i ; done

findの例
$ find /var/log -name "*log" -mtime -3 -type -f
$ find . -type f -exec grep -li aaa {} \;
$ find . -type f | xargs grep -li aaa
$ for i in `find . -type f`; do diff /work/$i $i > /dev/null 2>&1; if [ $? -ne 0 ]; then echo "diff /work/$i $i"; fi; done

この場合、xargsが呼び出すechoは1回
$ echo a b c | xargs echo

この場合、xargsが呼び出すechoは3回
$ echo a b c | xargs -n1 echo

正規表現を使わずにnetstatの結果をgrepする
$ netstat -an | grep tcp | grep :80 | grep LISTEN

正規表現を使ってnetstatの結果をgrepする
$ netstat -an | grep -e "^tcp.*:80.*LISTEN"

ディレクトリの存在をチェックし、なければ作成
$ test -d /tmp/foo || mkdir /tmp/foo

/usr/local直下のApacheをすべてrestart
$ for i in `ls -d /usr/local/apache*` ; do sudo $i/bin/apachectl restart ; done

返り値チェックを追加
$ for i in `ls -d /usr/local/apache*` ; do sudo $i/bin/apachectl restart ; test $? -ne 0 && echo "[ Apache Restart Failed ]" ; done

ログファイルを圧縮
$ find /var/log -name "*.log" -mtime 3 -type f | xargs -n1 sudo gzip --best

ログファイルから特定のアクセスを抽出
$ find /var/log -name "*.log" -type f | grep -e "^127.0.0.1.*"

awk


入力行の中でもっとも長いものの長さを出力
$ awk '{ if (length($0) > max) max = length($0) } END { print max }' data

50文字を越える長さの行を出力
$ awk 'length($0) > 50' data

入力行から空行を取り除く
$ awk 'NF > 0' data

入力行の行数を数える
$ awk 'END { print NR }' data

awkでcsvの特定行を置換して出力
$ awk -F, 'BEGIN{OFS=","} { if(NR%2==1 && $1~/a/){ sub(",b\"$", ",c\"$", $2); print $0} else print $0 }' input.csv > output.csv

0 件のコメント:

コメントを投稿

人気の投稿