web-dev-qa-db-ja.com

すべてのプログラマーが知っておくべきUnixコマンドまたはスクリプトの最も強力な例

すべてのプログラマーが知っておくべきことはたくさんありますが、私は特に私たち全員が知っておくべきUnix/Linuxコマンドに興味があります。 リファクタリングレポートネットワーク更新など、ある時点で遭遇する可能性のあるタスクを実行するため。

私が興味を持っているのは、以前にソフトウェア会社でソフトウェアテスターとして学位を勉強していたときに、すべての開発者(Windowsソフトウェアを開発していた)が2台のコンピューターを持っていることに気づいたからです。

左側にはWindows XP開発マシン、右側にはLinuxボックスがありました。Ubuntuだったと思います。とにかく、Windowsの強力なUNIX操作を提供するので使用したと言われました。彼らの開発プロセスではできませんでした。

これは、ソフトウェアエンジニアとして、Unix/Linuxオペレーティングシステムで実行できる最も強力なスクリプト/コマンド/使用法のいくつかであり、すべてのプログラマーが実際のタスクを解決するために知っておくべきだと思います。必然的にコードの記述に関連していますか?

sedawkgrepが何をするかは誰もが知っています。他のプログラマーが恩恵を受けることができるように、あなたにとって難しい問題を解決した実際のUnix/Linuxスクリプトの一部に興味があります。あなたのストーリーとソースを提供してください。

'Scripts'フォルダに保存されているこのような例はたくさんあると思います。

更新:人々は質問を誤解しているようです。私は個々のunixコマンドの名前を求めているのではなく、問題を解決したUNIXコードスニペットを求めています。

コミュニティからのベストアンサー


ディレクトリツリーを走査し、正規表現に一致するファイルへのパスを出力します:

find . -exec grep -l -e 'myregex' {} \; >> outfile.txt 

デフォルトのエディター(Nano/ViM)を呼び出す

(Mac OS Xを含むほとんどのUnixシステムで動作します)デフォルトのエディターは、 "[〜#〜] editor [〜#〜]"環境変数が設定されているものです。すなわち:export EDITOR =/usr/bin/picoこれはMac OS Xでは〜/ .profileにあります。

Ctrl+x Ctrl+e

実行中のすべてのネットワーク接続(それらが属するアプリを含む)を一覧表示します

lsof -i -nP

ターミナルの検索履歴をクリアする(私のお気に入りのもう1つ)

history -c
27
Brock Woolf

コミュニティからのベストアンサー


ディレクトリツリーを走査し、正規表現に一致するファイルへのパスを出力します:

find . -exec grep -l -e 'myregex' {} \; >> outfile.txt 

デフォルトのエディター(Nano/ViM)を呼び出す

(Mac OS Xを含むほとんどのUnixシステムで動作します)デフォルトのエディターは、 "[〜#〜] editor [〜#〜]"環境変数が設定されているものです。すなわち:export EDITOR =/usr/bin/picoこれはMac OS Xでは〜/ .profileにあります。

Ctrl+x Ctrl+e

実行中のすべてのネットワーク接続(それらが属するアプリを含む)を一覧表示します

lsof -i -nP

ターミナルの検索履歴をクリアする(私のお気に入りのもう1つ)

history -c
1
Brock Woolf

commandlinefu.com は、さまざまなシェルスクリプトレシピの優れたリソースであることがわかりました。

一般

# Run the last command as root
Sudo !!

# Rapidly invoke an editor to write a long, complex, or tricky command
ctrl-x ctrl-e

# Execute a command at a given time
echo "ls -l" | at midnight

難解

# output your microphone to a remote computer's speaker
dd if=/dev/dsp | ssh -c arcfour -C username@Host dd of=/dev/dsp
19
Alex B

VIを終了する方法

:wq

ファイルを保存し、惨めさを終わらせます。

:wq」の代わりに「:x」を使用して、viエディターを保存して閉じます。

13
quant_dev
  • grep
  • awk
  • sed
  • Perl
  • 見つける

Unixのパワーの多くは、テキストファイルを操作してデータをフィルタリングする機能に由来します。もちろん、これらのコマンドはすべてWindows用に入手できます。 Unixのように、OSではネイティブではありません。

パイプなどでコマンドをチェーンする機能。これにより、単純な関数から非常に強力な1行のコマンドを作成できます。

8
Xetius

あなたのシェルはあなたが利用できる最も強力なツールです

  1. 簡単なループなどを書くことができる
  2. ファイルグロブの理解(例:*。Javaなど)
  3. パイプ、サブシェルを介してコマンドをまとめることができます。リダイレクトなど。

そのレベルのシェルの知識があると、一時的なテキストファイルやコピー/貼り付けなどを介して情報を記録することなく、コマンドラインで膨大な量を実行でき、データのスライス/ダイシングを可能にする膨大な数のユーティリティプログラムを活用できます。 。

nix Power Tools これで多くのことがわかります。コピーを開くたびに、何か新しいものが見つかります。

4
Brian Agnew

私はこれをとても使いすぎて、実際に自分を恥じています。すべてのファイル名からスペースを削除し、アンダースコアに置き換えます。

[removespaces.sh]

#!/bin/bash
find .  -type f -name "* *" | while read file
do
   mv "$file" "${file// /_}"
done
4
ojblass

長いコマンドでタイプミスをした場合は、(bashで)置換してコマンドを再実行できます。

mkdir ~/aewseomeDirectory

「awesome」のつづりが間違っていることがわかります。次のように入力して、タイプミスを修正してコマンドを再実行できます。

^aew^awe

次に、置換したものを出力します(mkdir ~/aweseomeDirectory)そしてコマンドを実行します。 (間違ったコマンドで行ったダメージを元に戻すことを忘れないでください!)

3
micmoo

私の個人的なお気に入りはlsofコマンドです。

「lsof」を使用して、開いているファイル記述子、ソケット、およびパイプを一覧表示できます。どのプロセスが自分のマシンのどのポート/ファイルを使用しているかを把握しようとすると、非常に便利です。

例:ホスト名の解決がなく、ポートからポート名への変換がないすべてのインターネット接続を一覧表示します。

lsof -i -nP

http://www.manpagez.com/man/8/lsof/

3
coderjoe

trコマンドは、Unixで最も過小評価されているコマンドです。

#Convert all input to upper case
ls | tr a-z A-Z

#take the output and put into a single line 
ls | tr  "\n" " "

#get rid of all numbers
ls -lt | tr -d 0-9
2
ojblass
for card in `seq 1 8` ;do  
  for ts in `seq  1 31` ; do 
     echo $card $ts >>/etc/tuni.cfg;
   done
 done 

馬鹿げた248行の設定を手で書くよりはましでした。

すべての接頭辞が「tmp」である残りのテーブルを削除する必要があります

for table in `echo show tables | mysql quotiadb |grep ^tmp` ; do
  echo drop table $table
done

出力を確認し、ループを再実行してmysqlにパイプします

1
nos

「孤立した」次の行に検索文字列が見つかる可能性がある、(複数の)不適切な形式のログファイルを検索する方法。たとえば、id = 110375を検索するときに、1行目と、連結された3行目と4行目の両方を表示するには:

[2008-11-08 07:07:01] [INFO] ...; id = 110375; ...
[2008-11-08 07:07:02] [INFO] ...; id = 238998; ...
[2008-11-08 07:07:03] [ERROR] ... caught exception
...; id = 110375; ...
[2008-11-08 07:07:05] [INFO] ...; id = 800612; ...

sedを使用した2行の次の連結よりも、より良い解決策(はい、追加...!)があるはずです。実際に実行する前にgrep

#!/bin/bash

if [ $# -ne 1 ]
then
  echo "Usage: `basename $0` id"
  echo "Searches all myproject's logs for the given id"
  exit -1
fi  

# When finding "caught exception" then append the next line into the pattern
# space bij using "N", and next replace the newline with a colon and a space
# to ensure a single line starting with a timestamp, to allow for sorting
# the output of multiple files:
ls -rt /var/www/Rails/myproject/shared/log/production.* \
  | xargs cat | sed '/caught exception$/N;s/\n/: /g' \
  | grep "id = $1" | sort

...得た:

[2008-11-08 07:07:01] [INFO] ...; id = 110375; ...
[2008-11-08 07:07:03] [ERROR] ... caught exception: ...; id = 110375; ...

実際には、より一般的なソリューションでは、[タイムスタンプ]で始まらないすべての(場合によっては複数の)行が前の行に追加されます。誰ですか?もちろん、必ずしもsedを使用する必要はありません。

1
Arjan

一部の人は私に同意しないかもしれませんが、それでも、ここで話したいことがあります。 gawk(他のバリアントも同様)を完全に学習する場合は、grep/sed/wc/cut/pasteおよびその他のいくつかの* nixツールの学習と使用をスキップできます。必要なのは、多くの組み合わせの仕事をするための1つの優れたツールです。

1
ghostdog74

障害のあるLinuxボックスの問題を解決するとき、私が入力する最も一般的なキーシーケンスは alt + sysrq R E I S U B

1
Simon P Stevens

このツール(grep find、awk、sed)の能力は、その汎用性に由来するため、特定のケースを指定することはまったく役に立たないように思われます。

manは最も強力なコマンドです。これは、スタックオーバーフローから貼り付けを盲目的にコピーするのではなく、入力内容を理解できるためです。

例は大歓迎ですが、tisのトピックはすでにあります。私の最もよく使われる:

grep something_to_find * -R

ackとに置き換えることができます

find | xargs 

xargsにパイプされた結果で見つけることは非常に強力です

1
shodanex

Grep自体が表示されないPIDの検索

export CUPSPID=`ps -ef | grep cups | grep -v grep | awk '{print $2;}'`
1
ojblass

!!を使用して、bashで前のコマンドを繰り返します。私はよくchown otheruser: -R /home/otheruserを実行し、Sudoの使用を忘れます。須藤を忘れたら!!上向きにしてから家に帰るよりも少し簡単です。

Sudo !!

また、ポートの自動的に解決されるホスト名と名前が好きではないため、iptables -nL --line-numbersにマップされたiptablesのエイリアスを保持しています。行番号がデフォルトで非表示になっている理由すらわかりません。

最後に、プロセスがポートでリッスンしているかどうかを確認する場合は、実行できる正しいアドレスにバインドします

netstat -nlp

次に、プロセス名またはポート番号をgrepできます(-nは数値を示します)。

私はまた、ターミナルの色の助けを借りることが大好きです。私はこれをbashrcに追加して、それを読まなくても自分がルートであるかどうかを思い出させるのが好きです。これは実際に私を大いに助けました、私はもう須藤を決して忘れません。

red='\033[1;31m'
green='\033[1;32m'
none='\033[0m'

if [ $(id -u) -eq 0 ];
then
    PS1="[\[$red\]\u\[$none\]@\H \w]$ "
else
    PS1="[\[$green\]\u\[$none\]@\H \w]$ "
fi

これらはすべて非常に単純なコマンドですが、私はそれらを頻繁に使用します。それらのほとんどは、私のマシンではエイリアスに値するものでした。

0
Steen Schütt

余談ですが、WindowsでPowerShellを入手できます。その本当に強力で、* nixタイプのものの多くを行うことができます。クールな違いの1つは、テキストの代わりに.netオブジェクトを使用することです。これは、フィルタリングなどにパイプラインを使用している場合に役立ちます。

または、.NET統合が必要ない場合は、Windowsボックスに Cygwin をインストールします。 (そして、そのディレクトリをWindows PATHに追加します。)

0
Dave Archer

すべてのWebサービスを開始します

     find -iname '*weservice*'|xargs -I {} service {} restart

Javaサブディレクトリでローカルクラスを検索する

     find -iname '*.Java'|xargs grep 'class Pool'  

現在のパスのサブディレクトリでファイルからすべてのアイテムを再帰的に検索します。

     cat searches.txt| xargs -I {} -d, -n 1 grep  -r {} 

P.S searchs.txt:first、second、third、...、million

0
oxygen

Grep(try Windows Grep

sed(try Sed for Windows)

実際、 http://gnuwin32.sourceforge.net/ には、非常に便利な* nixコマンドの優れたポートセットがあります。 * nixの背景があり、現在Windowsを使用している場合は、おそらくそれらをチェックする必要があります。

0
ZombieSheep

チートシートを携帯しておくとよいでしょう...最も便利と言える単一のコマンドはありません。特定のコマンドがあなたの仕事をするなら、その便利で強力です

編集強力なシェルスクリプトが必要ですか?シェルスクリプトはプログラムです。基本を正しく理解し、個々のコマンドに基づいて構築すると、強力なスクリプトと呼ばれるものが得られます。あなたのニーズに応えるものは強力で、そうでなければ役に立たない。問題について言及し、それを解決する方法を尋ねたほうがよかったでしょう。

0
Umair Ahmed

検索コマンドで-nameと-inameを複数回使用できるという事実は、私にとって目を見張るものでした。

[findplaysong.sh]

#!/bin/bash
cd ~
echo Matched...
find /home/musicuser/Music/ -type f  -iname "*$1*" -iname "*$2*" -exec echo {} \;
echo Sleeping 5 seconds
sleep 5
find /home/musicuser/Music/ -type f  -iname "*$1*" -iname "*$2*" -exec mplayer {} \;
exit
0
ojblass
:() { :|: &} ;: 

フォーク爆弾ルートアクセスなし。

ご自身の責任でお試しください。

0

あるサーバーでは機能するが別のサーバーでは機能しない場合、関連するすべてのライブラリを比較できます。

export MYLIST=`ldd amule | awk ' { print $3; }'`; for a in $MYLIST; do cksum $a; done

このリストをマシン間のリストと比較すると、違いをすばやく特定できます。

0
ojblass

(マルチプロセッサアーキテクチャで)マシンに過負荷をかけすぎずに複数のプロセスを並行して実行するには、次のようにします。

NP=`cat /proc/cpuinfo | grep processor | wc -l`
#your loop here
    if [ `jobs | wc -l` -gt $NP ];
    then
         wait
    fi
    launch_your_task_in_background&
#finish your loop here
0
fortran