ホームページ  >  記事  >  運用・保守  >  入出力、リダイレクト、パイプラインの例

入出力、リダイレクト、パイプラインの例

零下一度
零下一度オリジナル
2017-06-30 15:49:422904ブラウズ
1, 入出力、リダイレクト、パイプライン
2, <(cmd);>(cmd)
3,>;<;>>;<<; >> 1. 入力と出力、リダイレクト、パイプライン
1. Linux プログラムには、次の 3 つの標準入力と出力があります。
数字の 0 で表される標準入力は、デフォルトで、プログラムは通常、ユーザー入力を取得するために使用されます
数値 1 で表される標準出力は、デフォルトで画面に接続され、プログラムは通常、情報を出力するために使用されます
標準エラー、によって表されます数字の 2 はデフォルトで画面に接続されており、通常はエラー メッセージを出力するためにプログラムが使用されます
分析:
passwd コマンドは標準入力からユーザーのパスワードを読み取るため、ユーザーは次のようにパスワードを入力できます。キーボード
echoコマンドは結果を標準出力に出力するので、結果を画面上で見ることができます
通常のユーザーには/rootディレクトリを参照する権限がないため、エラーが発生したため、エラーメッセージを出力します標準エラー、つまり
2、>>
> 元のデータを削除し、新しいデータを元のデータに追加します
3、/dev/null
通称:ゴミ箱ファイル
# echo hello world >/dev/null -- redirect このファイルへのデータはカーネルによって破棄されました。この機能を使用して、特定の出力情報をブロックできます
# ls / /root 2> /dev/null -- コマンドのエラー メッセージをシールドします
4. 出力リダイレクト
ユーザーはデフォルトの入力と出力を変更できます必要に応じて指示します
# ls -l > test
# ls -l 1> test -- どちらも標準出力をテストファイルにリダイレクトします。つまり、デフォルトの 1 は省略できます
# ls / jjjj 2> test -- 標準エラーをテスト ファイルにリダイレクトします
# ls / /jjjj 1> stdout 2> stderr -- 標準出力と標準エラーを 2 つの異なるファイルにリダイレクトします
# ls /jjjj / > std 2>&1 -- 標準エラーを標準出力にマージし、ファイルにリダイレクトします
# ls /jjjj / &> std -- 結果は前のステートメントと同等になります。
# ls /jjjj / &>> -- 標準出力と標準エラーもファイルにリダイレクトします
# cat 0< /etc/passwd # cat < /passwd
# cat /etc/passwd --cat コマンドの標準入力はファイル /etc/passwd から来ます
6, パイプ
上記のリダイレクトは標準入力です 入力と出力は に接続されていますファイル。 複数のプログラム間で標準の入出力を接続して、コマンド間でデータを転送することもできます。このテクノロジーは、パイプラインと呼ばれています。プログラムの出力は、左側のプログラムから始まり、パイプの中を流れていくようなものです。右端のプログラムに流れます。パイプは、Linux シェルの非常に一般的なテクノロジです。パイプ テクノロジを使用すると、複数の小さなツールを一緒に使用して、非常に複雑で強力な機能を完成させることができます。
# cat /etc/passwd | head -n 3 -- 左側のコマンドの標準出力は、右側のコマンドの標準入力として使用されます# cat /etc/passwd | head -n 3 | tail -n 1
7. 標準入力と出力の詳細な説明
標準入力と出力は、プログラム用にデフォルトで Linux によって作成される 3 つのファイル記述子です。ただし、これは必須ではありません。つまり、プログラムはこれら 3 つの標準ファイル記述子を使用できませんが、新しいファイル記述子を開いて使用できます。プログラムが標準入出力を使用しない場合、ここで使用されるリダイレクトは機能しません。 例:
passwd: プログラムは標準入力からユーザーのパスワードを読み取るため、標準入力をリダイレクトすることでパスワードを提供できます
ssh: コマンドはリモートログイン用のプログラムであり、ユーザーを読み取ります。パスワードを入力すると、標準入力は使用されないため、標準入力をリダイレクトしてパスワードを指定することはできません
8. プロセスの標準入力と出力に接続されているファイルを確認します
# sleep 999 1> /tmp /good 2>&1 -- 1 つの端末でコマンドを実行します
# pgrep -x sleep --別の端末で sleep のプロセス ID を見つけます
# lsof -anop 16715 -d 0,1,2 -- 開いているファイルを表示しますプロセスによって
9. リダイレクトのタイミングを確認します
# vim file
# cat -n file > file -- cat が各行の前に行番号を追加し、結果をリダイレクトすることを期待します。元のファイルに戻ります file
# cat file -- 空です
理由: シェルはコマンドを実行する前に、最初にリダイレクト操作を実行します。このリダイレクト操作により、ファイル file の内容が消去されます。リダイレクト操作によってファイルがクリアされ、ファイルが cat された後は、当然、コンテンツは表示されません
$ sudo ls /root > /root/ls.log -- この例では、ユーザーにはその機会がありません。パスワードを入力するには、リダイレクト操作が最初に実行されるため、現在のユーザーは通常のユーザーであり、パス /root/ls.log にファイルを作成できません。シェルはエラーになり、終了します: bash: /root/ls。ログ: アクセス許可が拒否されました。この時点では、sudo コマンドは実行されていないため、パスワードを入力する機会はありません
2。
プロセス置換による標準出力のリダイレクト
3. プロセス置換
プロセスの標準出力は一時ファイルに保存され、一時ファイルのパスが返されます<()。プログラムの出力はあるが、中間ファイルを生成したくない場合は、プロセス置換の使用を検討できます
# Past <(seq $(wc -l /etc/passwd | Cut - d" " -f1)) <( awk -F: '{print $1}' /etc/passwd)
# Past <(seq 26) <(awk -F: '{print $1}' /etc /passwd) -- これら 2 つを比較できますコマンド
3.>;<;>>;<<;>><<<
1, > create (存在する場合は上書き)
# echo 'hello world' > test -- test が存在しない場合は作成し、存在する場合はその内容を上書きします
2, < ; -- からの入力リダイレクトfile
# less < /etc/passwd --/etc/passwdの内容をツールに入力します
# cat < <(ls /) --ここでコマンド置換が使用されます
# wc - l < $(echo /etc/passwd)
# wc -l <(cat /etc/passwd) -- ここではプロセス置換が使用されます
3, > ;> -- ファイルにリダイレクトしますそれを作成します (存在する場合は、ファイルの最後に追加します)
# echo 'hello george' >> george -- george が存在しない場合は作成し、存在する場合はコンテンツを追加しますファイルの終わり
4. << --リダイレクト、ヒアドキュメント
に使用されます。ヒアドキュメント
の基本的な形式は次のとおりです。
cmd << 区切り文字
ここの文書の内容
区切り文字
: << 区切り文字 --shell バッチコメント
ここの文書の内容
区切り文字
関数: 2 つの区切り文字の内容 (ここでは、Document Content) が入力パラメーターとして cmd に渡されます
# cat <> two
>
EOF -- これは単なるロゴであり、任意の有効な文字に置き換えることができます
> -- この記号は、情報の入力を求めるために端末によって生成される識別子です
区切り文字 -- である必要があります前に大文字で書かれます スペースを含め、その後に文字を置くことはできません
4.3、shell
# vim here.sh --
注: 変数を使用することもできます
#!/ bin/bash
cat <output.shecho "hello"
echo "world"echo $1
EOF
# chmod a+x here.sh
# ./ here.sh george
# cat Output. sh -- ここで内容を表示します。 $1 はスクリプトのパラメータになるように展開されます
注:
この変数を展開したくない場合は、二重引用符を使用する必要があります。最初の EOF を囲みます。
4.4、<<-
こちらのドキュメント 別の使用法は、「<<」を「<<-」に変更することです。 <<- を使用する場合の唯一の変更点は、ヒア ドキュメントのコンテンツ部分の各行の前にあるタブ (タブ文字) が削除されることです。この使用法は、ヒア ドキュメントを記述するときにコンテンツ部分をインデントするためです。ドキュメントを読みます5、<<< --Redirect、for Here string
# wc -l <<< "$(ls -l /home)"
# while read #!/bin/bash
while read line
do
if [ "${line#ftp:}" != "$line" ];then
awk -F: '{print $6 }' < << $line
break
fi
done < /etc/passwd
注: /etc/passwd ファイルの各行をループします。ホームディレクトリを出力し、ループを終了します
${line#ftp:}: ftp: は特定の行の先頭で一致し、行の不一致部分のみが取得されます
# chmod a +x string.sh
# ./string. sh
4. テキスト処理_1: cat;head;tail;cut;wc;sort;uniq;tr;tac;rev
テキスト処理はタスクですすべてのシステム管理者が頻繁に使用する重要な内容は、複数のツールを柔軟に組み合わせてタスクを完了することです
1。さらに多くのファイルを順番に出力し、標準出力に出力します
# cat -n /etc/passwd --ファイルの内容を表示し、行番号を追加します
# cat -A /etc/passwd --いくつかの非表示の文字を出力し、位置マーク
# cat 1.txt 2.txt > test.txt -- ファイルをマージします
2, head -- ファイルヘッダーを読み取ります
# head -n 3 /etc/passwd -- 最初のファイルを読み取りますファイル /etc/passwd の 3 行
# head -n -1 file -- ファイルの最後の行を破棄します
# head -c 3 /etc/passwd -- ファイル /etc/passwd の最初の 3 バイトを読み取ります
# head -c -3 file -- ファイルの最後の 3 バイトを破棄します
# head -c 10m /dev/urandom > big -- 10M ファイルを作成します
3, tail -- ファイルの末尾を読み取りますファイル
#
tail -n 3 /etc/passwd -- ファイル /etc/passwd の最後の 3 行を読み取ります
# tail -n +28 /etc/passwd -- 28 行目から最後まで読み取りますファイルの最初の 27 行を破棄します
# tail -c 3 /etc/passwd -- ファイル /etc/passwd の最後の 3 バイトを読み取ります
# tail -c +28 /etc/passwd -- 28 バイト目からファイルの終わりまで読み取り、ヘッダーの 27 バイトを破棄します
# tail -f /etc/passwd -- 最後の内容を追跡しますファイルの変更。ログ ファイルの変更を観察するためによく使用され、非常に実用的です
4. Cut - この関数は awk に似ていますが、データを列に出力する場合、awk は awk ほど強力ではなく複雑ではありません。よく使う、カット あまり時間がない
共通オプション:
-d --区切り文字を定義
-b --指定された位置のバイトを出力
-c -- 指定された位置に文字を出力します
# echo "a;b;c d;e" | Cut -d ";" -- -d は区切り文字を定義します (デフォルトは TAB)。 - f 出力に対応するフィールドを定義します
# cat -n /etc/passwd | Cut -d $'n' -f1,3-5,7 -- 改行文字を区切り文字として使用します
# echo 私は中国人です | Cut -b1-3 --
-b は指定された位置のバイトを出力します。utf8 の中国語文字は 3 バイトを占めます
# echo 私は中国人です Cut -c2-4 --
-c指定された位置; -b との違いは、英語以外の文字を処理する場合です
# echo Be a Brave 中国語 Cut -b1-2,9 -- 「偽の」文字を出力します
# echo -n Be a Brave Chinese | xxd -- 3 つのバイト 1、2、9 が次のようになります: e581 87
# echo -n false xxd -- そして "false" も
5. wc - バイト数を計算します。 、文字、単語、データ行
共通オプション:
-c - バイト数を計算します
-m - 文字数を計算します
-w -- 数をカウントします単語数
-l -- 行数を数えます
# echo -n 私は中国人です | wc -c -- -c バイト数を数えます、5 utf8 中国語は 15 バイトを占めます
# echo - n I am Chinese | wc -m -- -m は、コマンド Cut
と同様に、英語以外の文字を処理する場合に文字数をカウントします。 - -w は単語の数を数えます。単語を区切る区切り文字はありません。中国語のいわゆる「単語」とは異なり、5 文字を 1 つの単語としてカウントします
# echo -n Uppercase CHINESE | wc - w --2 つの単語
# echo -n Uppercase CHINESE | wc -c --17 英語バイト、-n なしの 18 バイト (改行文字があるため)
# echo -n Uppercase CHINESE | wc -m --17 英字、-n なし 18 (改行文字があるため)
# wc -l /etc/passwd -- -l は行数をカウントします
6. 並べ替え -- ファイルを行ごとに並べ替えます
共通オプション:
-t -- 区切り文字を指定します
-k -- 並べ替えフィールドを指定します
--重複した行を削除
-n, -h -- 値で並べ替え
-r -- 逆に並べ替え
# Cut -d ":" -f7 /etc/passwd -- -u 重複行を削除
# echo -e "1n2n10" | sort
# echo -e "1n2n10" sort -n -- -n 数値によるソート、K、M、G などは扱えません。
# ls -lh | tail -n +2 | sort -k5,5n -- -k は、ソートするフィールドを指定します。数値によって、K、M、G などの単位文字を処理できます
# head -4 /etc/passwd | sort -t: -k7,7
-- -t はフィールド区切り文字としてコロンを使用します。7 を押しますフィールドの並べ替え
# head -4 /etc/passwd | sort -t: -k7,7 -k3,3n --まず 7 番目のフィールドで並べ替え、7 番目のフィールドが同じ場合は、次に 3 番目のフィールドで並べ替えます
# echo -e "1n2n3" | sort -nr -- -r 並べ替えを反転します
# head -4 /etc/passwd | sort -t: -k7,7 -k3,3nr -- 3 番目のフィールドの並べ替えを反転します、同時に 2 つのフィールドを反転することもできます
7. uniq -- 連続する重複行を削除します
共通オプション:
-c -- 重複行の数をカウントします
# echo - e "1n1n2n1" | uniq -- 2 つの 1 が連続していないため、結果にはまだ 2 つの 1 が存在します
# echo -e "1n1n2n1" -- 重複を削除するために並べ替えは連続している必要はありません
# Cut -d: -f7 /etc/passwd | sort | uniq -c -- sort コマンドの例に基づいて、異なるログインシェルの出現数をカウントします
8, tr -- 同じ文字を変換、削除、削減します
共通オプション:
-d --delete、一致する文字をすべて削除
-s --reduce、同じ文字を減らす
形式: tr SET1 SET2
注: セット 1 の文字をセット 2 の対応する文字に変換するため、原則として 2 つのセットの文字数は同じである必要があります。 2 つのセット 文字数が等しくない場合、プログラムはエラーにはなりません。この場合の結果には注意してください。 ポイント:
a と tr は 2 つのセットにどのような文字があるかは気にせず、単に対応する位置の文字を 1 つずつ置き換えるだけです。
b と tr は 1 つの文字を置き換えることはできません。文字列を置き換えます
# echo abc | tr a-z A-Z -- 26 個の小文字を対応する大文字に変換します
# echo abc tr ab BA -- a と b をそれぞれ B と A に変換します
# echo良いこと | tr 良いか悪いか -- 「良い」は「悪い」に変換されます
# echo abcdefg | tr a-z AB -- セット 2 は短くなり、プログラムはセット 2 の最後の文字を自動的に使用してセット 2 を展開します
# echo abcdefg | tr a-b A-Z -- セット 2 は長くなり、プログラムは自動的にセット 2 を短くします
# echo Abc | tr a-zA-Z A-Za-z -- 英語の文字のサイズを反転します
# hello world | tr -d ow -- -d 一致する文字をすべて削除します
# echo 0123456789 | tr -d 13579
# tr -d '
# head -c 3m bigfile > file1 -- 最初の 3M データを file1 にインポートします
# tail -c 4m bigfile > file3 -- 最後の 3M データを file3 にインポートします
# head -c 6m bigfile - c 3m > file2 -- 中間 4M データを file2 にインポートします
# ls -lh file*
# cat file1 file2 file3 > newbigfile --cat を使用して 3 つのファイルを新しい大きなファイルにマージします
# md5sum newbigfile bigfile -- コマンドを使用して、古い大きなファイルと新しい大きなファイルの md5sum 値を比較します

以上が入出力、リダイレクト、パイプラインの例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。