Liunxデータストリームリダイレクトソート、sed、awk


データフローリダイレクト

データストリームリダイレクト:コマンドを実行すると、コマンドはファイルからデータを読み取り、処理後に画面に出力する場合があります。標準出力と標準エラー出力は、それぞれ[標準出力]と[標準エラー出力]を表します。

標準出力:コマンドラインから返される正しい情報

標準エラー出力:コマンドが失敗した後に返されるエラーメッセージ

  • 標準入力(stdin):コードは0です。<または<<を使用してください
  • 標準出力(stdout):コードは1で、>または>>を使用します
  • 標準エラー出力(stderr):コードは2で、2>または2 >>を使用します。

上記のコードの意味:

  • 1>:指定したファイルまたはデバイスに[正しいデータ]を上書きして出力します
  • 1 >>:[正しいデータ]を指定したファイルまたはデバイスに累積的に出力します
  • 2>:上書きして指定したファイルまたはデバイスに[間違ったデータ]を出力します
  • 2 >>:指定したファイルまたはデバイスに[間違ったデータ]を累積的に出力します

場合:

# 下面的命令输出了正确的日志信息和错误的日志信息
[hadoop@bigdata01 tmp]$ find /home -name .bashrc
find: ‘/home/ruoze’: Permission denied
/home/hadoop/.bashrc
find: ‘/home/azkaban’: Permission denied

# 分别输出正确信息和错误信息到不同的文件,执行命令会输出正确日志和错误日志
find /home -name .bashrc > right.out 2>error.out

# 将错误日志和正确日志写到一个文件中且保证日志输出的顺序
find /home -name .bashrc > all.out 2>&1  -- 推荐使用
find /home -name .bashrc &> all.out 

ソートコマンドの使用

sortはソートに役立ち、指定されたデータ形式に従ってソートできます。たとえば、数値とテキストのソートは異なります。

[root@bigdata01 ~]# sort --help
Usage: sort [OPTION]... [FILE]...
  or:  sort [OPTION]... --files0-from=F

  -b, --ignore-leading-blanks 忽略最前面空格字符部分
  -f, --ignore-case           忽略大小写的差异
  -k, --key=KEYDEF            以哪个区间来进行排
  -r, --reverse               反向排序
  -u, --unique                uniq,相同的数据只出现一行
  -t, --field-separator=SEP   分割符号,就是以【Tab】键进行分割
  -n, --numeric-sort          以【纯数字】进行排序,(默认是使用文字形式进行排序)
  。。。。

uniqの用途:

[root@bigdata01 ~]# uniq --help
Usage: uniq [OPTION]... [INPUT [OUTPUT]]
  -c, --count           进行计数
  -i, --ignore-case     忽略大小写

場合:

[hadoop@bigdata01 tmp]$ cat test3.txt 
hadoop
hadoop
hadoop
spark
spark
spark

[hadoop@bigdata01 tmp]$ cat test3.txt | uniq 
hadoop
spark

wcの用途:

[root@bigdata01 ~]# wc --help
Usage: wc [OPTION]... [FILE]...
  -c, --bytes            统计字节数
  -m, --chars            统计字符数
  -l, --lines            列出多少行

場合:

[hadoop@bigdata01 tmp]$ cat test.txt |wc 
     16      16     227
[hadoop@bigdata01 tmp]$ cat test.txt |wc -l
16
[hadoop@bigdata01 tmp]$ cat test.txt |wc -m
227
[hadoop@bigdata01 tmp]$ cat test.txt |wc -w
16

sedコマンドは簡単に使用できます

Sedはストリームエディタであり、テキスト処理に非常に優れたツールであり、正規表現で完全に使用でき、その機能は並外れています。処理中、現在処理されている行は「パターンスペース」と呼ばれる一時バッファに格納され、バッファ内のコンテンツはsedコマンドで処理さます。処理が完了すると、バッファのコンテンツが画面に送信されます。次に、次の行を処理し、ファイルの終わりまでこの方法を繰り返します。リダイレクトを使用して出力を保存しない限り、ファイルの内容は変更されません。Sedは主に、1つ以上のファイルを自動的に編集するために使用されます。データ行の置換、削除、追加、選択、ファイルに対する繰り返し操作の簡素化、変換プログラムの作成などの特定のタスクを実行できます。

sed的命令格式:sed [options] 'command' file(s);

sed的脚本格式:sed [options] -f scriptfile file(s);

パラメータ:

 -e :直接在命令行模式上进行sed动作编辑,此为默认选项;

 -f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作;

 -i :直接修改文件内容;

 -n :只打印模式匹配的行;

 -r :支持扩展表达式;

 -h或--help:显示帮助;

 -V或--version:显示版本信息。

sedの一般的なコマンド

 a\ 在当前行下面插入文本;
 i\ 在当前行上面插入文本;
 c\ 把选定的行改为新的文本;
 d 删除,删除选择的行;
 D 删除模板块的第一行;
 s 替换指定字符;

場合:

# 替换指定的内容
[root@bigdata01 tmp]# cat test3.txt 
HADOOP
HADOOP
HADOOP
spark
spark
spark
[root@bigdata01 tmp]# sed 's/HADOOP/hadoop/g' test3.txt ==> 不会替换原文件呢中内容
hadoop
hadoop
hadoop
spark
spark
spark
[root@bigdata01 tmp]# cat test3.txt 
HADOOP
HADOOP
HADOOP
spark
spark
spark
[root@bigdata01 tmp]# sed -i 's/HADOOP/hadoop/g' test3.txt ==> 替换原文件中的内容
[root@bigdata01 tmp]# cat test3.txt 
hadoop
hadoop
hadoop
spark
spark
spark
[root@bigdata01 tmp]# 

データの検索と表示:

[root@bigdata01 tmp]# clear
[root@bigdata01 tmp]# nl test.txt |sed '2,5d'  ===> 不显示2行和5行
     1	1,hadoopdoophadoophaoddop,3
     6	6,flume,56
     7	7,kylin,2
     8	8,es,1
     9	9,hadoop,4
    10	10,hadoop,12
    11	11,flink,6
    12	12,flink,4
    13	13,spark,4
    14	14,spark,56
    15	15,spark,22
    16	16,spark,33
[root@bigdata01 tmp]# nl test.txt |sed '3,$d'  ===> 不显示第三行到最后一行
     1	1,hadoopdoophadoophaoddop,3
     2	2,flinflinkflinkflinkflinkk,5
[root@bigdata01 tmp]# nl test.txt |sed '2,$d' ===> 不显示第二行到最后一行,只显示第一行
     1	1,hadoopdoophadoophaoddop,3

awkの一般的に使用されるコマンド

Awkは強力なテキスト分析ツールです。簡単に言えば、awkは、ファイルを1行ずつ(スペース、タブ)読み取るデフォルトの区切り文字として各行をスライスし、カットされた部分に対してさまざまな分析と処理を実行します。

データの行全体を処理するために一般的に使用されるsedと比較して、awkは処理のために行をいくつかのフィールドに分割することを好むため、awkは小さなテキストデータの処理に非常に適しています

awk [-F field-separator] 'commands' input-file(s)

awk '条件类型1{操作1} 条件类型2{操作2}...' filename

[-Fセパレータ]はオプションです。awkはデフォルトのフィールドセパレータとしてスペースとタブを使用するため、フィールド間にスペースまたはタブがあるテキストを参照する場合は、このオプションを指定する必要はありませんが、ファイルを参照する場合は、 / etc / passwdとして、このファイルの各フィールドがコロンで区切られている場合は、-Fオプションを指定する必要があります

  • NF:各行のフィールド数($ 0)
  • NR:awkが現在配置されている行の数
  • FS:現在の分割文字。デフォルトはスペースバーです。
# 原始数据文件
[root@bigdata01 tmp]# cat tmpdata.txt  
1,hadoop,23323
2,spark,234244
3,kafka,897373
4,scrip,123947
5,bangk,627449
6,hadoop,13445
7,hadoop,23454

# 使用awk进行处理 -F指定分隔符 $1 为第一列  $2 为第二列 ,FS默认为空格,NF每一行的字段数,NR 第几行
[root@bigdata01 tmp]# cat tmpdata.txt |awk -F ',' '{print $1 "\t" $2 FS "\t" NF "\t" NR}'
1	hadoop,	3	1
2	spark,	3	2
3	kafka,	3	3
4	scrip,	3	4
5	bangk,	3	5
6	hadoop,	3	6
7	hadoop,	3	7

# 输出文件中的第二行并去重
[root@bigdata01 tmp]# cat tmpdata.txt |awk -F ',' '{print $2}'| uniq 
hadoop
spark
kafka
scrip
bangk
hadoop
[root@bigdata01 tmp]# 

# 输出文件中的第二行,按照第二行统计单词并去重,统计去重后的个数
[root@bigdata01 tmp]# cat tmpdata.txt |awk -F ',' '{print $2}'| uniq | wc -l
6

awkと上記の一般的なコマンドを組み合わせると、日常の使用シーンにほぼ対応できます

おすすめ

転載: blog.csdn.net/qq_43081842/article/details/110334894