【Linux】Linuxの基本操作コマンド

1. Linux でよく使用される記号

* 任意の文字列を表します
任意の文字を表します
/ ルートディレクトリを表すか、パス区切り文字として使用されます
\ エスケープ文字。
<ENTER> 行継続文字。行継続文字を使用して、コマンド ラインを複数行に記述することができます。
$ 変数値の置換: $PATH は、環境変数 PATH の値を表します。
' 「...」間の文字は通常の文字として扱われます
「...」間の文字はテキストとして扱われ、変数値の置換が許可されます。
` コマンド置換。コマンドの実行結果を「…」に置き換えます。
< リダイレクト文字を入力してください
> リダイレクト文字を出力する
| パイプ文字
& バックグラウンド実行文字。コマンドの後に文字「&」を追加すると、コマンドがバックグラウンドで実行されます。
; 複数のコマンドが連続して実行される
() サブシェルでコマンドを実行する
{} 現在のシェルでコマンドを実行する
コマンド履歴内のコマンドを実行する
ログインユーザーのホームディレクトリ(ホームディレクトリ)を表します。

2. 歴史的記録

Linux システムは、ユーザーがシェルに入力したすべてのコマンドの履歴を保持し、ユーザーが履歴を通じて使用されたコマンドを見つけて、この履歴内のコマンドを呼び出すための多くの方法を提供します。

[root@node01 ~]# history
    1  ifconfig
    2  nmcli connection modify ens33 ipv4.addresses 192.168.2.220/24 ipv4.gateway 192.168.2.1 ipv4.method manual autoconnect yes
    3  route -n
    4  nmcli connection down ens33
   .
   .
   .
文法 交換する
!! 前のコマンド
!ん コマンド番号n
!-ん 最後からn番目のコマンド
!cmd cmd を開始するために使用された最後のコマンド

履歴に関連するファイルと変数

[root@node01 ~]# echo $HISTFILE
/root/.bash_history
#用户的历史记录保存的位置
[root@node01 ~]# echo $HISTFILESIZE
1000
#启动时,从历史记录中读取的记录条数
[root@node01 ~]# echo $HISTSIZE
1000
#退出时,被写入历史记录的最大条数

歴史のヒント

esc+./alt+.	调用上一条命令的最后一部分内容
ctrl+r	在历史记录中搜索给出关键字的命令

3. 標準入力、標準出力、標準エラー

Linux システムでは、ほとんどの場合、キーボードからの入力を読み取り、ターミナルに出力を表示します。キーボードで入力するほとんどのことは、コマンドを実行することです。これらのコマンドは、ターミナル プログラムに属します。ターミナル プログラムに加えて、グラフィックス プログラムや画面も含まれます。プログラム (vim など) は、どのような種類のプログラムであっても、入力、出力、およびエラーを伴います。ほとんどの場合、私たちはキーボードで情報を入力し、モニターで情報を表示します (正しい)これらの入力情報を標準入力(0で表すことができる)、出力する情報を標準出力(1で表すことができる)、エラー情報(2で表すことができる)をそれぞれ呼びます。標準誤差と呼ばれます。日常的な使用においては、キーボードを使って情報を入力したり、ディスプレイから情報を読み取ったりするだけでなく、プログラムを指定してキーボード以外の場所から入力が必要な内容を読み取ったり、プログラムに情報を出力させることもできます。ディスプレイ以外でも。

入出力をリダイレクトする

#重定向输出
[root@node01 ~]# mkdir a
[root@node01 ~]# cd a
[root@node01 a]# mkdir aa ab ac
[root@node01 a]# cd aa
[root@node01 aa]# touch bb bc bd
[root@node01 ~]# ls a/ > test	
[root@node01 ~]# cat test
aa
ab
ac
[root@node01 ~]# ls a/aa/ >> test
[root@node01 ~]# cat test
aa
ab
ac
bb
bc
bd

>覆盖
>>追加
#重定向输入
[root@node01 ~]# wc -l test
6 hello
[root@node01 ~]# wc -l < test 
6
注意:第一个例子,会输出文件名;第二个不会,因为它仅仅知道从标准输入读取内容。

標準入力は 0、標準出力は 1、標準誤差は 2 で表されることがわかっています。出力情報には、次のような正しい情報と間違った情報の両方が含まれる場合があります。

[root@node01 ~]# ls /etc/rc.d/
init.d  rc0.d  rc1.d  rc2.d  rc3.d  rc4.d  rc5.d  rc6.d  rc.local
[root@node01 ~]# head -1 /etc/rc.d/*
==> /etc/rc.d/init.d <==
head: 读取'/etc/rc.d/init.d' 时出错: 是一个目录

==> /etc/rc.d/rc0.d <==
head: 读取'/etc/rc.d/rc0.d' 时出错: 是一个目录

==> /etc/rc.d/rc1.d <==
head: 读取'/etc/rc.d/rc1.d' 时出错: 是一个目录

==> /etc/rc.d/rc2.d <==
head: 读取'/etc/rc.d/rc2.d' 时出错: 是一个目录

==> /etc/rc.d/rc3.d <==
head: 读取'/etc/rc.d/rc3.d' 时出错: 是一个目录

==> /etc/rc.d/rc4.d <==
head: 读取'/etc/rc.d/rc4.d' 时出错: 是一个目录

==> /etc/rc.d/rc5.d <==
head: 读取'/etc/rc.d/rc5.d' 时出错: 是一个目录

==> /etc/rc.d/rc6.d <==
head: 读取'/etc/rc.d/rc6.d' 时出错: 是一个目录

==> /etc/rc.d/rc.local <==
#!/bin/bash

ls コマンドを使用して /etc/rc.d ディレクトリを表示すると、このディレクトリにディレクトリとファイルの両方があることがわかります。また、「head -1」コマンドを使用してファイルの最初の行を表示すると、当然、ディレクトリ内の最初の行は表示できず、エラーが報告されますが、内容を見ずにこれらすべての情報を指定したファイルに書き込みたい場合は、どうすればよいでしょうか?

[root@node01 ~]# head -1 /etc/rc.d/* > test
head: 读取'/etc/rc.d/init.d' 时出错: 是一个目录
head: 读取'/etc/rc.d/rc0.d' 时出错: 是一个目录
head: 读取'/etc/rc.d/rc1.d' 时出错: 是一个目录
head: 读取'/etc/rc.d/rc2.d' 时出错: 是一个目录
head: 读取'/etc/rc.d/rc3.d' 时出错: 是一个目录
head: 读取'/etc/rc.d/rc4.d' 时出错: 是一个目录
head: 读取'/etc/rc.d/rc5.d' 时出错: 是一个目录
head: 读取'/etc/rc.d/rc6.d' 时出错: 是一个目录
[root@node01 ~]# cat test
==> /etc/rc.d/init.d <==
==> /etc/rc.d/rc0.d <==
==> /etc/rc.d/rc1.d <==
==> /etc/rc.d/rc2.d <==
==> /etc/rc.d/rc3.d <==
==> /etc/rc.d/rc4.d <==
==> /etc/rc.d/rc5.d <==
==> /etc/rc.d/rc6.d <==
==> /etc/rc.d/rc.local <==
#!/bin/bash
```powershell

我们可以利用之前的>将输出的信息重定向到一个指定的文件,但是仍然会收到错误提示,这是为什么呢?因为在linux当中正确的输出和错误的输出实际上是两种数据流,默认情况下这两种数据流都会在显示器上打印出来,而我们使用的>相当于1>,也就是将正确的信息写入到了test文件中,错误的信息依旧会看到。利用前面的提到0,1,2这三个数字,我们可以这样做
```powershell
[root@node01 ~]# head -1 /etc/rc.d/* > test 2> test.err
[root@node01 ~]# cat test
==> /etc/rc.d/init.d <==
==> /etc/rc.d/rc0.d <==
==> /etc/rc.d/rc1.d <==
==> /etc/rc.d/rc2.d <==
==> /etc/rc.d/rc3.d <==
==> /etc/rc.d/rc4.d <==
==> /etc/rc.d/rc5.d <==
==> /etc/rc.d/rc6.d <==
==> /etc/rc.d/rc.local <==
#!/bin/bash
[root@node01 ~]# cat test.err 
head: 读取'/etc/rc.d/init.d' 时出错: 是一个目录
head: 读取'/etc/rc.d/rc0.d' 时出错: 是一个目录
head: 读取'/etc/rc.d/rc1.d' 时出错: 是一个目录
head: 读取'/etc/rc.d/rc2.d' 时出错: 是一个目录
head: 读取'/etc/rc.d/rc3.d' 时出错: 是一个目录
head: 读取'/etc/rc.d/rc4.d' 时出错: 是一个目录
head: 读取'/etc/rc.d/rc5.d' 时出错: 是一个目录
head: 读取'/etc/rc.d/rc6.d' 时出错: 是一个目录

しかし、これらはまだ 2 つのファイルです。これらすべての情報を 1 つのファイルに書き込むことができますか?

[root@node01 ~]# head -1 /etc/rc.d/* > test.both 2>&1
[root@node01 ~]# cat test.both 
==> /etc/rc.d/init.d <==
head: 读取'/etc/rc.d/init.d' 时出错: 是一个目录
==> /etc/rc.d/rc0.d <==
head: 读取'/etc/rc.d/rc0.d' 时出错: 是一个目录
==> /etc/rc.d/rc1.d <==
head: 读取'/etc/rc.d/rc1.d' 时出错: 是一个目录
==> /etc/rc.d/rc2.d <==
head: 读取'/etc/rc.d/rc2.d' 时出错: 是一个目录
==> /etc/rc.d/rc3.d <==
head: 读取'/etc/rc.d/rc3.d' 时出错: 是一个目录
==> /etc/rc.d/rc4.d <==
head: 读取'/etc/rc.d/rc4.d' 时出错: 是一个目录
==> /etc/rc.d/rc5.d <==
head: 读取'/etc/rc.d/rc5.d' 时出错: 是一个目录
==> /etc/rc.d/rc6.d <==
head: 读取'/etc/rc.d/rc6.d' 时出错: 是一个目录
==> /etc/rc.d/rc.local <==
#!/bin/bash

または

[root@node01 ~]# head -1 /etc/rc.d/* >& test.both1
[root@node01 ~]# cat test.both1 
==> /etc/rc.d/init.d <==
head: 读取'/etc/rc.d/init.d' 时出错: 是一个目录
==> /etc/rc.d/rc0.d <==
head: 读取'/etc/rc.d/rc0.d' 时出错: 是一个目录
==> /etc/rc.d/rc1.d <==
head: 读取'/etc/rc.d/rc1.d' 时出错: 是一个目录
==> /etc/rc.d/rc2.d <==
head: 读取'/etc/rc.d/rc2.d' 时出错: 是一个目录
==> /etc/rc.d/rc3.d <==
head: 读取'/etc/rc.d/rc3.d' 时出错: 是一个目录
==> /etc/rc.d/rc4.d <==
head: 读取'/etc/rc.d/rc4.d' 时出错: 是一个目录
==> /etc/rc.d/rc5.d <==
head: 读取'/etc/rc.d/rc5.d' 时出错: 是一个目录
==> /etc/rc.d/rc6.d <==
head: 读取'/etc/rc.d/rc6.d' 时出错: 是一个目录
==> /etc/rc.d/rc.local <==
#!/bin/bash

这两种使用方式都是告诉shell将错误信息写入到正确信息所写入的文件中。
如果这些错误信息是我们早就知道的,并且还不想看到的呢?
[root@node01 ~]# head -1 /etc/rc.d/* 2> /dev/null 
==> /etc/rc.d/init.d <==
==> /etc/rc.d/rc0.d <==
==> /etc/rc.d/rc1.d <==
==> /etc/rc.d/rc2.d <==
==> /etc/rc.d/rc3.d <==
==> /etc/rc.d/rc4.d <==
==> /etc/rc.d/rc5.d <==
==> /etc/rc.d/rc6.d <==
==> /etc/rc.d/rc.local <==
#!/bin/bash

/dev/null:表示的是一个黑洞,通常用于丢弃不需要的数据输出

要約すると、入力と出力のリダイレクトとマージの使用法は次のとおりです。

文法 効果
cmd < ファイル ファイルからの標準入力をリダイレクトする
cmd > ファイル 標準出力をファイルにリダイレクトし、ファイルが存在する場合は上書き (破損)
cmd>>ファイル 標準出力をファイルにリダイレクトし、ファイルが存在する場合はそれに追加します
cmd 2>ファイル 標準エラーをファイルにリダイレクトします。ファイルが存在する場合は、それを上書き(破損)します。
cmd 2>> ファイル 標準エラーをファイルにリダイレクトします。ファイルが存在する場合は、そのファイルに追加します。
cmd>ファイル 2>&1 標準出力と標準エラーを結合し、ファイルにリダイレクトします (移植可能な構文)
cmd >& ファイル 標準出力と標準エラーを結合し、ファイルにリダイレクトします (便利な構文)

4. パイプライン

前に、プロセスの出力を端末ディスプレイ以外の場所にリダイレクトできること、またはプロセスが端末キーボード以外の場所から入力を読み取ることができることを見てきました。最も一般的で強力なリダイレクト形式の 1 つは、この 2 つを組み合わせたもので、あるコマンドの出力 (標準出力) が別のコマンドの入力 (標準入力) に直接「パイプ」されます。これにより、Linux ( Unix など) はパイプを呼び出します。2 つのコマンドが一緒にパイプ接続されると、最初のプロセスの標準出力ストリームは 2 番目のプロセスの標準入力シーケンスに直接接続されます。bash でパイプラインを作成するには、2 つのコマンドを縦棒線 | で接続します。

画像20200323144226709.png

[root@node01 ~]# pwd
/root
[root@node01 ~]# ls | grep ana
anaconda-ks.cfg
注意:从管道读数据是一次性操作,数据一旦被读,它就从管道中被抛弃,释放空间以便写更多的数据。它只能处理经由前面一个指令传出的正确输出信息,对错误信息信息没有直接处理能力。然后,传递给下一个命令,作为标准的输入。

5. データ処理のための共通ツール

5.1. find ファイル検索コマンド

.  代表当前目录
~  代表用户家目录

コマンドオプションを見つける

-name	按照文件名查找文件。
[root@node01 ~]# find ~ -name "test.*"
/root/test.err
/root/test.both
/root/test.both1


-perm	按照文件权限来查找文件。
[root@node01 ~]# chmod 777 hello
[root@node01 ~]# find . -perm 777
./hello


-user	按照文件属主来查找文件。
-group	按照文件所属的组来查找文件。
-uid	查找指定uid
-gid	查找指定gid
[root@node01 ~]# chown hello.hello test
[root@node01 ~]# find . -user hello
./test
[root@node01 ~]# find . -group hello
./test
[root@node01 ~]# chown root.hello hello
[root@node01 ~]# find . -user root -group hello
./hello
[root@node01 ~]# find . -uid 1000
./test
[root@node01 ~]# find . -gid 1000
./test


-mtime -n +n	按照文件的更改时间来查找文件, -n表示n天以内,+n表示n天以前。还有-atime和-ctime 选项
-amin/-cmin/-mmin n		 查找系统中最后N分钟

  
#如果-mtime +2 表示当前时间-2day以前的mtime的文件。即文件的mtime小于 sysdate -2
#如果-mtime -2 表示当前时间-2day以后的mtime的文件。即文件的mtime大于 sysdate -2
#如果-mtime  2 表示文件mtime在sysdate -2 与 sysdate-1 之间的文件。
#!!!!!实际上再记不住,记住一般删除旧数据,一定是选择+。

[root@node01 ~]# find /etc -mtime -2 
/etc
/etc/cups
/etc/cups/subscriptions.conf
/etc/resolv.conf



-nogroup	查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。
-nouser	查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。
[root@node01 ~]# chown 1400.1400 hello
[root@node01 ~]# ll hello
-rwxrwxrwx 1 1400 1400 8 3月  22 23:25 hello
[root@node01 ~]# find . -nogroup
./hello
[root@node01 ~]# find . -nouser
./hello

-newer file1 查找更改时间比文件file1新的文件。
[root@node01 ~]# find /etc -newer initial-setup-ks.cfg 
/etc
/etc/dnf/modules.d
/etc/dnf/modules.d/httpd.module
/etc/logrotate.d
还有anewer和cnewer




-type	查找某一类型的文件,诸如:
b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。


[root@node01 ~]# find /etc -newer initial-setup-ks.cfg -type f
/etc/dnf/modules.d/httpd.module
/etc/logrotate.d/glusterfs
/etc/pki/nssdb/cert9.db
/etc/pki/nssdb/key4.db
/etc/yum.repos.d/server.repo


-size n[bcwkMG] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
			b	512字节一块
			c	字节
			w	字(2字节)
			k	k字节(1024)
			M	M字节(1024x1024字节)
			G	G字节(1024x1024x1024字节)
[root@node01 ~]# find . -size +1M
./.cache/tracker/meta.db
./.cache/tracker/meta.db-wal
./.cache/mozilla/firefox/mduza4q4.default/startupCache/startupCache.8.little
./.cache/mozilla/firefox/mduza4q4.default/startupCache/scriptCache-child-current.bin
./.cache/mozilla/firefox/mduza4q4.default/startupCache/scriptCache-current.bin
./.mozilla/firefox/mduza4q4.default/places.sqlite
./.mozilla/firefox/mduza4q4.default/favicons.sqlite
# 在使用的时候注意一下单位,如find . -size 4k使用4k时会显示所有大与3k小于等于4k的文件,如果使用的是4096c则是查找大小为4k的文件
[root@node01 ~]# find . -size 4k
.
./.cache/mozilla/firefox/mduza4q4.default/startupCache/urlCache-current.bin
./.cache/mozilla/firefox/mduza4q4.default/startupCache/urlCache.bin
./.cache/mozilla/firefox/mduza4q4.default/safebrowsing
./.config/pulse
./.mozilla/firefox/mduza4q4.default
./.mozilla/firefox/mduza4q4.default/datareporting/archived/2020-02
./.mozilla/firefox/mduza4q4.default/saved-telemetry-pings
[root@node01 ~]# find . -size 4096c
.
./.cache/mozilla/firefox/mduza4q4.default/safebrowsing
./.config/pulse
./.mozilla/firefox/mduza4q4.default
./.mozilla/firefox/mduza4q4.default/datareporting/archived/2020-02
./.mozilla/firefox/mduza4q4.default/saved-telemetry-pings
[root@node01 ~]# find . -size 4k |wc -l
8
[root@node01 ~]# find . -size 4096c |wc -l
6
[root@node01 ~]# ll -h .cache/mozilla/firefox/mduza4q4.default/startupCache/urlCache-current.bin 
-rw-r--r-- 1 root root 3.1K 2月  24 02:34 .cache/mozilla/firefox/mduza4q4.default/startupCache/urlCache-current.bin


-follow:如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。
[root@node01 ~]# ln -s /etc/ linketc
[root@node01 ~]# find . -name passwd
[root@node01 ~]# find . -name passwd -follow
./linketc/pam.d/passwd
./linketc/passwd

-exec   command   {
    
    } \;      —–将查到的文件执行command操作,{
    
    } 和 \;之间有空格
-ok 和-exec相同,只不过在操作前要询用户
[root@node01 ~]# find /etc -name passwd -exec grep "hello" {} \;
hello:x:1000:1000:hello:/home/hello:/bin/bash
[root@node01 ~]# find /etc -name passwd -ok grep "hello" {} \;
< grep ... /etc/pam.d/passwd > ? y
< grep ... /etc/passwd > ? y
hello:x:1000:1000:hello:/home/hello:/bin/bash


-empty	查找空文件或目录
[root@node01 ~]# find /etc -empty
/etc/crypttab
/etc/dnf/aliases.d
/etc/dnf/modules.defaults.d


-inum	查找i节点编号为指定数值的文件
-samefile	查找相同的文件

[root@node01 ~]# ln hello hello1
[root@node01 ~]# ln hello hello2
[root@node01 ~]# ll -i hello
34510098 -rwxrwxrwx 3 1400 1400 8 3月  22 23:25 hello
[root@node01 ~]# find . -inum 34510098
./hello
./hello1
./hello2

[root@node01 ~]# find . -samefile hello
./hello
./hello1
./hello2

5.2. grep&egrep データ取得コマンド

正規表現を使用してテキストを検索し、一致する行を出力できる強力なテキスト検索ツール。最もよく使用されます。egrep は grep の拡張機能であり、より多くの正規表現メタキャラクタをサポートしており、grep -E と同等です。

useradd hello
useradd hello
useradd hello

grep および正規表現記号

^ 行的开始 如:'^grep'匹配所有以grep开头的行。
[root@node01 ~]# grep '^he' /etc/passwd

$	行的结束 如:'grep$'匹配所有以grep结尾的行。
[root@node01 ~]# grep 'sh$' /etc/passwd

.	匹配一个非换行符('\n')的字符如:'gr.p'匹配gr后接一个任意字符,然后是p。
[root@node01 ~]# grep 't.e' /etc/passwd

* 匹配零个或多个先前字符 如:' *grep' (注意*前有空格)匹配所有零个或多个空格后紧跟grep的行,需要用egrep 或者grep带上 -E 选项。 .*一起用代表任意字符。
[root@node01 ~]# grep -E 'el*lo' /etc/passwd

[]	匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。
[root@node01 ~]# grep '[Hh]el' /etc/passwd

[^] 匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-F和H-Z的一个字母开头,紧跟rep的行。
[root@node01 ~]# grep '[^A-Z]ello' /etc/passwd
[root@node01 ~]# grep '[^a-z]ello' /etc/passwd

\?	匹配零个或一个先前的字符。如:'gre\?p'匹配gr后跟一个或零个e字符,然后是p的行。
[root@node01 ~]# grep 'hell\?o' /etc/passwd
hello:x:1000:1000:hello:/home/hello:/bin/bash
helo:x:1002:1002::/home/helo:/bin/bash

x\{
    
    m\} 重复字符x,m次,如:'o\{5\}'匹配包含5个o的行。
[root@node01 ~]# grep 'l\{2\}' /etc/passwd

x\{
    
    m,\} 重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行。
[root@node01 ~]# grep 'l\{2,\}' /etc/passwd

x\{
    
    m,n\} 重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。
[root@node01 ~]# grep 'l\{1,3\}' /etc/passwd

\b 单词锁定符,如: '\bgrep\b'只匹配grep。
[root@node01 ~]# grep 'hell' /etc/passwd
hello:x:1000:1000:hello:/home/hello:/bin/bash
helllo:x:1003:1003::/home/helllo:/bin/bash
[root@node01 ~]# grep '\bhell\b' /etc/passwd


egrep和 grep -E的扩展集
+	匹配一个或多个先前的字符。如:'[a-z]+able',匹配一个或多个小写字母后跟able的串.
[root@node01 ~]# grep -E '[a-z]+llo' /etc/passwd
hello:x:1000:1000:hello:/home/hello:/bin/bash
helllo:x:1003:1003::/home/helllo:/bin/bash
[root@node01 ~]# grep -E '[a-z]+lo' /etc/passwd

?	作用同\?,如:'gre?p'匹配gr后跟一个或零个e字符,然后是p的行。
[root@node01 ~]# grep -E 'hel?lo' /etc/passwd
hello:x:1000:1000:hello:/home/hello:/bin/bash
helo:x:1002:1002::/home/helo:/bin/bash
[root@node01 ~]# grep 'hel?lo' /etc/passwd
[root@node01 ~]# grep 'hel\?lo' /etc/passwd
hello:x:1000:1000:hello:/home/hello:/bin/bash
helo:x:1002:1002::/home/helo:/bin/bash

a|b|c 匹配a或b或c。如:grep|sed匹配grep或sed
[root@node01 ~]# grep -E 'llo|lllo' /etc/passwd
hello:x:1000:1000:hello:/home/hello:/bin/bash
helllo:x:1003:1003::/home/helllo:/bin/bash

*	0次或多次
?	0次或1次
+	1次或多次

-E		支持扩展正则,相当于egrep
-i		不区分大小写
-v		取反,显示不匹配的
--color=auto	高亮显示

5.3. sort はファイルの内容をソートします。

共通コマンドオプション

-b 忽略每行前面开始出的空格字符。
[root@node01 ~]# sort passwd
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
 hello:x:1000:1000:hello:/home/hello:/bin/bash
    HELLO:x:1001:1001::/home/HELLO:/bin/bash
      helo:x:1002:1002::/home/helo:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
[root@node01 ~]# sort -b passwd
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
 hello:x:1000:1000:hello:/home/hello:/bin/bash
    HELLO:x:1001:1001::/home/HELLO:/bin/bash
      helo:x:1002:1002::/home/helo:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
root:x:0:0:root:/root:/bin/bash

-c 检查文件是否已经按照顺序排序。
[root@node01 ~]# sort -c passwd 
sort:passwd:2:无序: bin:x:1:1:bin:/bin:/sbin/nologin

-t	用指定的符号做为分隔符
-k	指定区间
-n 	依照数值的大小排序。
-r 以相反的顺序来排序。
[root@node01 ~]# sort -t ':' -k 3 -r -n  passwd 
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
      helo:x:1002:1002::/home/helo:/bin/bash
    HELLO:x:1001:1001::/home/HELLO:/bin/bash
 hello:x:1000:1000:hello:/home/hello:/bin/bash
dbus:x:81:81:System message bus:/:/sbin/nologin
   apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
或者
[root@node01 ~]# sort -t ':' -k 3rn passwd 
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
      helo:x:1002:1002::/home/helo:/bin/bash
    HELLO:x:1001:1001::/home/HELLO:/bin/bash
 hello:x:1000:1000:hello:/home/hello:/bin/bash
dbus:x:81:81:System message bus:/:/sbin/nologin
   apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
root:x:0:0:root:/root:/bin/bash


-o<输出文件> 将排序后的结果存入指定的文件。
[root@node01 ~]# sort -t ':' -k 3 -r -n  passwd -o /root/passwd-sort
[root@node01 ~]# cat /root/passwd-sort 
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
      helo:x:1002:1002::/home/helo:/bin/bash
    HELLO:x:1001:1001::/home/HELLO:/bin/bash
 hello:x:1000:1000:hello:/home/hello:/bin/bash
dbus:x:81:81:System message bus:/:/sbin/nologin
   apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
root:x:0:0:root:/root:/bin/bash

5.4. 固有データの重複排除

通常はソートと一緒に使用されます

事件文書

[root@node01 ~]# cat testuniq
192.168.98.2
192.168.98.8
192.168.98.3
192.168.98.3
192.168.98.9
192.168.98.8
192.168.98.8
192.168.98.0
192.168.98.3

共通コマンドオプション

-c	在每列旁边显示该行重复出现的次数。
[root@node01 ~]# uniq -c testuniq 
      1 192.168.98.2
      1 192.168.98.8
      2 192.168.98.3
      1 192.168.98.9
      2 192.168.98.8
      1 192.168.98.0
      1 192.168.98.3

[root@node01 ~]# uniq -c testuniq | sort
      1 192.168.98.0
      1 192.168.98.2
      1 192.168.98.3
      1 192.168.98.8
      1 192.168.98.9
      2 192.168.98.3
      2 192.168.98.8

-d	仅显示重复出现的行列。
[root@node01 ~]# uniq -d testuniq 
192.168.98.3
192.168.98.8

-u	仅显示出一次的行列。
[root@node01 ~]# uniq -u testuniq 
192.168.98.2
192.168.98.8
192.168.98.9
192.168.98.0
192.168.98.3
[root@node01 ~]# uniq -u testuniq | sort
192.168.98.0
192.168.98.2
192.168.98.3
192.168.98.8
192.168.98.9

5.5. ツリーはディレクトリの内容をツリー構造でリストします。

-a 显示所有文件和目录,默认不显示隐藏文件
[root@node01 ~]# tree -a

-C 在文件和目录清单加上色彩,便于区分各种类型。
[root@node01 ~]# tree -C

-d 只显示目录。
[root@node01 ~]# tree -d

-D 列出文件或目录的更改时间。
[root@node01 ~]# tree -D
.
├── [Feb  4 15:07]  公共
├── [Feb  4 15:07]  模板

-f 在每个文件或目录之前,显示完整的路径名称。
[root@node01 ~]# tree -f
.
├── ./公共
├── ./模板

-F 加上文件类型标记,在执行文件,目录,Socket,管道名称名称,各自加上"*","/","@","|"号。
[root@node01 ~]# tree -F
.
├── 公共/
├── 模板/

-g -u 列出文件或目录的所属群组、主名称,没有对应的名称时,则显示群组、主的识别码。
[root@node01 ~]# tree -g
.
├── [root    ]  公共
├── [root    ]  模板

-i 不以阶梯状列出文件或目录名称。
[root@node01 ~]# tree -i
.
公共
模板
视频

-n 不在文件和目录清单加上色彩。
[root@node01 ~]# tree -n
.
├── 公共
├── 模板

-p 列出权限标示。
[root@node01 ~]# tree -p
.
├── [drwxr-xr-x]  公共
├── [drwxr-xr-x]  模板

-s 列出文件或目录大小。
[root@node01 ~]# tree -s
.
├── [          6]  公共
├── [          6]  模板

-t 用文件和目录的更改时间排序。
[root@node01 ~]# tree -t
.
├── anaconda-ks.cfg
├── initial-setup-ks.cfg
├── 公共

-u 列出文件或目录的拥有者名称,没有对应的名称时,则显示用户识别码。
[root@node01 ~]# tree -u
.
├── [root    ]  公共
├── [root    ]  模板

-L 显示目录层数,数值为正整数
[root@node01 ~]# tree -a -L 2
.
├── .cache
│   ├── dconf
│   ├── event-sound-cache.tdb.d5b6fe70a77f4945aa0999abdd33e686.x86_64-redhat-linux-gnu
│   ├── evolution
│   ├── gnome-shell
│   ├── gnome-software

5.6. xargs コマンド

xargs はコマンドにパラメータを渡すためのフィルターであり、複数のコマンドを組み合わせるツールです。ls などのパイプ入力をサポートしない一部のコマンドに使用されます。

ケースファイル

[root@node01 ~]# cat xargtest 
a a a
b b b
c c c
d d d
e
f
g
h
i
j
k
l

共通コマンドオプション

-n num 后面加列数
[root@node01 ~]# cat xargtest | xargs -n 2
a a
a b
b b
c c
c d
d d
e f
g h
i j
k l
[root@node01 ~]# cat xargtest | xargs
a a a b b b c c c d d d e f g h i j k l

-I	指定替换的字符串,并在后续的命令中用指定的字符串表示接收到的输入内容,并执行,可以用任意字符代替(不推荐有特殊含义的字符,如*等,如果使用请记得转意),一般为[]{
    
    }
[root@node01 ~]# mkdir testx
[root@node01 ~]# find /var/ -name "*.log" | xargs  -I a cp a ./testx
[root@node01 ~]# ls testx | wc -l
39

-i	类似-I,相当于固定就是使用{
    
    }来表示接收到的输入内容
[root@node01 ~]# find /var/ -name "*.log" | xargs  -i cp {} ./testx
[root@node01 ~]# ls testx | wc -l
39


-d 指定分隔符
[root@node01 ~]# echo "a9b9c9d9" | xargs -d 9
a b c d 

おすすめ

転載: blog.csdn.net/qq_45277554/article/details/130882656