文件管理常用命令

cat命令

  • 语法

    cat [-AbeEnstTuv] [--help] [--version] fileName

    参数说明:

    -n 或 --number:由 1 开始对所有输出的行数编号。

    -b 或 --number-nonblank:和 -n 相似,只不过对于空白行不编号。

    -s 或 --squeeze-blank:当遇到有连续两行以上的空白行,就代换为一行的空白行。

    -v 或 --show-nonprinting:使用 ^ 和 M- 符号,除了 LFD 和 TAB 之外。

    -E 或 --show-ends : 在每行结束处显示 $。

    -T 或 --show-tabs: 将 TAB 字符显示为 ^I。

    -A, --show-all:等价于 -vET。

    -e:等价于"-vE"选项;

    -t:等价于"-vT"选项;

  • 示例

    • 文件追加

      cat -n textfile1 > textfile2
    • 把 textfile1 和 textfile2 的文档内容加上行号(空白行不加)之后将内容附加到 textfile3 文档里

      cat -b textfile1 textfile2 >> textfile3
    • 清空文件

      cat /home/null /home/test.txt
    • 输出文件

      cat log.log

chmod命令

  • 语法

    chmod [-cfvR] [--help] [--version] mode file...

    mode : 权限设定字串,格式如下 :

    [ugoa...][[+-=][rwxX]...][,...]

    其中:

    • u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。

    • + 表示增加权限、- 表示取消权限、= 表示唯一设定权限。

    • r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行。

    其他参数说明:

    • -c : 若该文件权限确实已经更改,才显示其更改动作

    • -f : 若该文件权限无法被更改也不要显示错误讯息

    • -v : 显示权限变更的详细资料

    • -R : 对目前目录下的所有文件与子目录进行相同的权限变更(即以递归的方式逐个变更)

    • --help : 显示辅助说明

    • --version : 显示版本

  • 符号模式

    使用符号模式可以设置多个项目:who(用户类型),operator(操作符)和 permission(权限),每个项目的设置可以用逗号隔开。 命令 chmod 将修改 who 指定的用户类型对文件的访问权限,用户类型由一个或者多个字母在 who 的位置来说明,如 who 的符号模式表所示:

    who
    用户类型
    说明

    u

    user

    文件所有者

    g

    group

    文件所有者所在组

    o

    others

    所有其他用户

    a

    all

    所用用户, 相当于 ugo

  • operator 的符号模式表:

    Operator
    说明

    +

    为指定的用户类型增加权限

    -

    去除指定用户类型的权限

    =

    设置指定用户权限的设置,即将用户类型的所有权限重新设置

  • permission 的符号模式表:

    模式
    名字
    说明

    r

    设置为可读权限

    w

    设置为可写权限

    x

    执行权限

    设置为可执行权限

    X

    特殊执行权限

    只有当文件为目录文件,或者其他类型的用户有可执行权限时,才将文件权限设置可执行

    s

    setuid/gid

    当文件被执行时,根据who参数指定的用户类型设置文件的setuid或者setgid权限

    t

    粘贴位

    设置粘贴位,只有超级用户可以设置该位,只有文件所有者u可以使用该位

  • 八进制语法

    chmod命令可以使用八进制数来指定权限。文件或目录的权限位是由9个权限位来控制,每三位为一组,它们分别是文件所有者(User)的读、写、执行,用户组(Group)的读、写、执行以及其它用户(Other)的读、写、执行。历史上,文件权限被放在一个比特掩码中,掩码中指定的比特位设为1,用来说明一个类具有相应的优先级。

    #
    权限
    rwx
    二进制

    7

    读 + 写 + 执行

    rwx

    111

    6

    读 + 写

    rw-

    110

    5

    读 + 执行

    r-x

    101

    4

    只读

    r--

    100

    3

    写 + 执行

    -wx

    011

    2

    只写

    -w-

    010

    1

    只执行

    --x

    001

    0

    ---

    000

    例如, 765 将这样解释:

    • 所有者的权限用数字表达:属主的那三个权限位的数字加起来的总和。如 rwx ,也就是 4+2+1 ,应该是 7。

    • 用户组的权限用数字表达:属组的那个权限位数字的相加的总和。如 rw- ,也就是 4+2+0 ,应该是 6。

    • 其它用户的权限数字表达:其它用户权限位的数字相加的总和。如 r-x ,也就是 4+0+1 ,应该是 5。

  • 示例

    将文件 file1.txt 设为所有人皆可读取 :

    chmod ugo+r file1.txt

    将文件 file1.txt 设为所有人皆可读取 :

    chmod a+r file1.txt

    将文件 file1.txt 与 file2.txt 设为该文件拥有者,与其所属同一个群体者可写入,但其他以外的人则不可写入 :

    chmod ug+w,o-w file1.txt file2.txt

    将 ex1.py 设定为只有该文件拥有者可以执行 :

    chmod u+x ex1.py

    将目前目录下的所有文件与子目录皆设为任何人可读取 :

    chmod -R a+r 

    此外chmod也可以用数字来表示权限如 :

    chmod 777 file

    语法为:

    chmod abc file

    其中a,b,c各为一个数字,分别表示User、Group、及Other的权限。

  • r=4,w=2,x=1

    • 若要 rwx 属性则 4+2+1=7;

    • 若要 rw- 属性则 4+2=6;

    • 若要 r-x 属性则 4+1=5。

    chmod a=rwx file
    chmod 777 file
    chmod ug=rwx,o=x file
    chmod 771 file

    效果相同

    若用 chmod 4755 filename 可使此程序具有 root 的权限。

  • 更多说明

    命令

    说明

    chmod a+r file

    给file的所有用户增加读权限

    chmod a-x file

    删除file的所有用户的执行权限

    chmod a+rw file

    给file的所有用户增加读写权限

    chmod +rwx file

    给file的所有用户增加读写执行权限

    chmod u=rw,go= file

    对file的所有者设置读写权限,清空该用户组和其他用户对file的所有权限(空格代表无权限)

    chmod -R u+r,go-r docs

    对目录docs和其子目录层次结构中的所有文件给用户增加读权限,而对用户组和其他用户删除读权限

    chmod 664 file

    对file的所有者和用户组设置读写权限, 为其其他用户设置读权限

    chmod 0755 file

    相当于u=rwx (4+2+1),go=rx (4+1 & 4+1)0 没有特殊模式。

    chmod 4755 file

    4设置了设置用户ID位,剩下的相当于 u=rwx (4+2+1),go=rx (4+1 & 4+1)。

    find path/ -type d -exec chmod a-x {} \;

    删除可执行权限对path/以及其所有的目录(不包括文件)的所有用户,使用'-type f'匹配文件

    find path/ -type d -exec chmod a+x {} \;

    允许所有用户浏览或通过目录path/

chown命令

  • 语法

    chown [-cfhvR] [--help] [--version] user[:group] file...

    参数 :

    • user : 新的文件拥有者的使用者 ID

    • group : 新的文件拥有者的使用者组(group)

    • -c : 显示更改的部分的信息

    • -f : 忽略错误信息

    • -h :修复符号链接

    • -v : 显示详细的处理信息

    • -R : 处理指定目录以及其子目录下的所有文件

    • --help : 显示辅助说明

    • --version : 显示版本

  • 示例

    把 /var/run/httpd.pid 的所有者设置 root:

    chown root /var/run/httpd.pid

    将文件 file1.txt 的拥有者设为 haiji,群体的使用者 haijigroup :

    chown haiji:haijigroup file1.txt

    将当前前目录下的所有文件与子目录的拥有者皆设为 haiji,群体的使用者 haijigroup:

    chown -R haiji:haijigroup 

    把 /home/runoob 的关联组设置为 512 (关联组ID),不改变所有者:

    chown :512 /home/haiji

find命令

  • 语法

    find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \

    参数说明 :

    find 根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部份为 path,之后的是 expression。如果 path 是空字串则使用目前路径,如果 expression 是空字串则使用 -print 为预设 expression。

    expression 中可使用的选项有二三十个之多,在此只介绍最常用的部份。

    -mount, -xdev : 只检查和指定目录在同一个文件系统下的文件,避免列出其它文件系统中的文件

    -amin n : 在过去 n 分钟内被读取过

    -anewer file : 比文件 file 更晚被读取过的文件

    -atime n : 在过去n天内被读取过的文件

    -cmin n : 在过去 n 分钟内被修改过

    -cnewer file :比文件 file 更新的文件

    -ctime n : 在过去n天内被修改过的文件

    -empty : 空的文件-gid n or -group name : gid 是 n 或是 group 名称是 name

    -ipath p, -path p : 路径名称符合 p 的文件,ipath 会忽略大小写

    -name name, -iname name : 文件名称符合 name 的文件。iname 会忽略大小写

    -size n : 文件大小 是 n 单位,b 代表 512 位元组的区块,c 表示字元数,k 表示 kilo bytes,w 是二个位元组。

    -type c : 文件类型是 c 的文件。

    d: 目录

    c: 字型装置文件

    b: 区块装置文件

    p: 具名贮列

    f: 一般文件

    l: 符号连结

    s: socket

    -pid n : process id 是 n 的文件

    你可以使用 ( ) 将运算式分隔,并使用下列运算。

    exp1 -and exp2

    ! expr

    -not expr

    exp1 -or exp2

    exp1, exp2

  • 示例

    将当前目录及其子目录下所有文件后缀为 .c 的文件列出来:

    # find . -name "*.c"

    将目前目录其其下子目录中所有一般文件列出

    # find . -type f

    将当前目录及其子目录下所有最近 20 天内更新过的文件列出:

    # find . -ctime -20

    查找 /var/log 目录中更改时间在 7 日以前的普通文件,并在删除之前询问它们:

    # find /var/log -type f -mtime +7 -ok rm {} \;

    查找当前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件:

    # find . -type f -perm 644 -exec ls -l {} \;

    查找系统中所有文件长度为 0 的普通文件,并列出它们的完整路径:

    # find / -type f -size 0 -exec ls -l {} \;

cut命令

  • 语法

    cut  [-bn] [file]
    cut [-c] [file]
    cut [-df] [file]

    使用说明:

    cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。

    如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。

    参数:

    • -b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。

    • -c :以字符为单位进行分割。

    • -d :自定义分隔符,默认为制表符。

    • -f :与-d一起使用,指定显示哪个区域。

    • -n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的范围之内,该字符将被写出;否则,该字符将被排除

  • 示例

    cat -b 3 log.log

ln命令

  • 语法

    ln [参数][源文件或目录][目标文件或目录]

    其中参数的格式为

    [-bdfinsvF] [-S backup-suffix] [-V {numbered,existing,simple}]

    [--help] [--version] [--]

    命令功能 : Linux文件系统中,有所谓的链接(link),我们可以将其视为档案的别名,而链接又可分为两种 : 硬链接(hard link)与软链接(symbolic link),硬链接的意思是一个档案可以有多个名称,而软链接的方式则是产生一个特殊的档案,该档案的内容是指向另一个档案的位置。硬链接是存在同一个文件系统中,而软链接却可以跨越不同的文件系统。

    不论是硬链接或软链接都不会将原本的档案复制一份,只会占用非常少量的磁碟空间。

    软链接

    • 1.软链接,以路径的形式存在。类似于Windows操作系统中的快捷方式

    • 2.软链接可以 跨文件系统 ,硬链接不可以

    • 3.软链接可以对一个不存在的文件名进行链接

    • 4.软链接可以对目录进行链接

    硬链接

    • 1.硬链接,以文件副本的形式存在。但不占用实际空间。

    • 2.不允许给目录创建硬链接

    • 3.硬链接只有在同一个文件系统中才能创建

    命令参数

    必要参数

    • -b 删除,覆盖以前建立的链接

    • -d 允许超级用户制作目录的硬链接

    • -f 强制执行

    • -i 交互模式,文件存在则提示用户是否覆盖

    • -n 把符号链接视为一般目录

    • -s 软链接(符号链接)

    • -v 显示详细的处理过程

    选择参数

    • -S "-S<字尾备份字符串> "或 "--suffix=<字尾备份字符串>"

    • -V "-V<备份方式>"或"--version-control=<备份方式>"

    • --help 显示帮助信息

    • --version 显示版本信息

  • 示例

    ln -s /root/logs/test/log.log  /root/logs/

    验证输出

    # ll log.log
    lrwxrwxrwx. 1 root root 26 Jan 20 21:59 log.log -> /root/logs/test/log.log

less命令

  • 语法

    less [参数] 文件 

    参数说明

    • -b <缓冲区大小> 设置缓冲区的大小

    • -e 当文件显示结束后,自动离开

    • -f 强迫打开特殊文件,例如外围设备代号、目录和二进制文件

    • -g 只标志最后搜索的关键词

    • -i 忽略搜索时的大小写

    • -m 显示类似more命令的百分比

    • -N 显示每行的行号

    • -o <文件名> 将less 输出的内容在指定文件中保存起来

    • -Q 不使用警告音

    • -s 显示连续空行为一行

    • -S 行过长时间将超出部分舍弃

    • -x <数字> 将"tab"键显示为规定的数字空格

    • /字符串:向下搜索"字符串"的功能

    • ?字符串:向上搜索"字符串"的功能

    • n:重复前一个搜索(与 / 或 ? 有关)

    • N:反向重复前一个搜索(与 / 或 ? 有关)

    • b 向上翻一页

    • d 向后翻半页

    • h 显示帮助界面

    • Q 退出less 命令

    • u 向前滚动半页

    • y 向前滚动一行

    • 空格键 滚动一页

    • 回车键 滚动一行

    • [pagedown]: 向下翻动一页

    • [pageup]: 向上翻动一页

  • 示例

    1、查看文件

    less log.log

    2、ps查看进程信息并通过less分页显示

    ps -ef |less

    3、浏览多个文件

    less log2.log log1.log

    说明: 输入 :n后,切换到 log2.log 输入 :p 后,切换到log1.log

  • 附加备注

    1.全屏导航

    • ctrl + F - 向前移动一屏

    • ctrl + B - 向后移动一屏

    • ctrl + D - 向前移动半屏

    • ctrl + U - 向后移动半屏

    2.单行导航

    • j - 向前移动一行

    • k - 向后移动一行

    3.其它导航

    • G - 移动到最后一行

    • g - 移动到第一行

    • q / ZZ - 退出 less 命令

    4.其它有用的命令

    • v - 使用配置的编辑器编辑当前文件

    • h - 显示 less 的帮助文档

    • &pattern - 仅显示匹配模式的行,而不是整个文件

    5.标记导航

    当使用 less 查看大文件时,可以在任何一个位置作标记,可以通过命令导航到标有特定标记的文本位置:

    • ma - 使用 a 标记文本的当前位置

    • 'a - 导航到标记 a 处

more命令

  • 语法

    more [-dlfpcsu] [-num] [+/pattern] [+linenum] [fileNames..]

    参数

    • -num 一次显示的行数

    • -d 提示使用者,在画面下方显示 [Press space to continue, 'q' to quit.] ,如果使用者按错键,则会显示 [Press 'h' for instructions.] 而不是 '哔' 声

    • -l 取消遇见特殊字元 ^L(送纸字元)时会暂停的功能

    • -f 计算行数时,以实际上的行数,而非自动换行过后的行数(有些单行字数太长的会被扩展为两行或两行以上)

    • -p 不以卷动的方式显示每一页,而是先清除萤幕后再显示内容

    • -c 跟 -p 相似,不同的是先显示内容再清除其他旧资料

    • -s 当遇到有连续两行以上的空白行,就代换为一行的空白行

    • -u 不显示下引号 (根据环境变数 TERM 指定的 terminal 而有所不同)

    • +/pattern 在每个文档显示前搜寻该字串(pattern),然后从该字串之后开始显示

    • +num 从第 num 行开始显示

    • fileNames 欲显示内容的文档,可为复数个数

  • 示例

    逐页显示 testfile 文档内容,如有连续两行以上空白行则以一行空白行显示。

    more -s testfile

    从第 20 行开始显示 testfile 之文档内容。

    more +20 testfile
  • 常用操作命令

    • Enter 向下n行,需要定义。默认为1行

    • Ctrl+F 向下滚动一屏

    • 空格键 向下滚动一屏

    • Ctrl+B 返回上一屏

    • = 输出当前行的行号

    • :f 输出文件名和当前行的行号

    • V 调用vi编辑器

    • !命令 调用Shell,并执行命令

    • q 退出more

mv命令

  • 语法

    mv [options] source dest
    mv [options] source... directory

    参数说明

    • -b: 当目标文件或目录存在时,在执行覆盖前,会为其创建一个备份。

    • -i: 如果指定移动的源目录或文件与目标的目录或文件同名,则会先询问是否覆盖旧文件,输入 y 表示直接覆盖,输入 n 表示取消该操作。

    • -f: 如果指定移动的源目录或文件与目标的目录或文件同名,不会询问,直接覆盖旧文件。

    • -n: 不要覆盖任何已存在的文件或目录。

    • -u:当源文件比目标文件新或者目标文件不存在时,才执行移动操作。

    mv 参数设置与运行结果

    命令格式
    运行结果

    mv source_file(文件) dest_file(文件)

    将源文件名 source_file 改为目标文件名 dest_file

    mv source_file(文件) dest_directory(目录)

    将文件 source_file 移动到目标目录 dest_directory 中

    mv source_directory(目录) dest_directory(目录)

    目录名 dest_directory 已存在,将 source_directory 移动到目录名 dest_directory 中;目录名 dest_directory 不存在则 source_directory 改名为目录名 dest_directory

    mv source_directory(目录) dest_file(文件)

    出错

  • 示例

    将文件 aaa 改名为 bbb :

    mv aaa bbb

    将 info 目录放入 logs 目录中。注意,如果 logs 目录不存在,则该命令将 info 改名为 logs。

    mv info/ logs 

    再如将 **/usr/haiji下的所有文件和目录移到当前目录下,命令行为:

    $ mv /usr/haiji/*  . 

cp命令

  • 语法

    cp [options] source dest
    
    cp [options] source... directory

    参数说明

    • -a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR参数组合。

    • -d:复制时保留链接。这里所说的链接相当于Windows系统中的快捷方式。

    • -f:覆盖已经存在的目标文件而不给出提示。

    • -i:与-f选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖,回答"y"时目标文件将被覆盖。

    • -p:除复制文件的内容外,还把修改时间和访问权限也复制到新文件中。

    • -r:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。

    • -l:不复制文件,只是生成链接文件。

  • 示例

    使用指令 cp 将当前目录 test/ 下的所有文件复制到新目录 newtest 下,输入如下命令:

    $ cp –r test/ newtest          

    注意:用户使用该指令复制目录时,必须使用参数 -r 或者 -R

rm命令

  • 语法

    rm [options] name...

    参数

    • -i 删除前逐一询问确认。

    • -f 即使原档案属性设为唯读,亦直接删除,无需逐一确认。

    • -r 将目录及以下之档案亦逐一删除。

  • 示例

    删除文件可以直接使用rm命令,若删除目录则必须配合选项"-r",例如:

    # rm  test.txt 
    rm:是否删除 一般文件 "test.txt"? y  
    # rm  homework  
    rm: 无法删除目录"homework": 是一个目录  
    # rm  -r  homework  
    rm:是否删除 目录 "homework"? y 

    删除当前目录下的所有文件及目录,命令行为:

    rm  -r  * 

    文件一旦通过rm命令删除,则无法恢复,所以必须格外小心地使用该命令。

rcp命令

rcp指令用在远端复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到该目录中。

  • 语法

    rcp [-pr][源文件或目录][目标文件或目录]
    rcp [-pr][源文件或目录...][目标文件]

    参数

    -p  保留源文件或目录的属性,包括拥有者,所属群组,权限与时间。

    -r  递归处理,将指定目录下的文件与子目录一并处理。

  • 示例

    使用rcp指令复制远程文件到本地进行保存。

    设本地主机当前账户为rootlocal,远程主机账户为root,要将远程主机(218.6.132.5)主目录下的文件"testfile"复制到本地目录"test"中,则输入如下命令:

    rcp root@218.6.132.5:./testfile testfile  #复制远程文件到本地  
    rcp root@218.6.132.5:home/rootlocal/testfile testfile  
    #要求当前登录账户cmd 登录到远程主机  
    rcp 218.6.132.5:./testfile testfile

    注意:指令"rcp"执行以后不会有返回信息,仅需要在目录"test"下查看是否存在文件"testfile"。若存在,则表示远程复制操作成功,否则远程复制操作失败。

scp命令

scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。

scp 是加密的,rcp 是不加密的,scp 是 rcp 的加强版。

  • 语法

    scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
    [-l limit] [-o ssh_option] [-P port] [-S program]
    [[user@]host1:]file1 [...] [[user@]host2:]file2

    参数说明:

    • -1: 强制scp命令使用协议ssh1

    • -2: 强制scp命令使用协议ssh2

    • -4: 强制scp命令只使用IPv4寻址

    • -6: 强制scp命令只使用IPv6寻址

    • -B: 使用批处理模式(传输过程中不询问传输口令或短语)

    • -C: 允许压缩。(将-C标志传递给ssh,从而打开压缩功能)

    • -p:保留原文件的修改时间,访问时间和访问权限。

    • -q: 不显示传输进度条。

    • -r: 递归复制整个目录。

    • -v:详细方式显示输出。scp和ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题。

    • -c cipher: 以cipher将数据传输进行加密,这个选项将直接传递给ssh。

    • -F ssh_config: 指定一个替代的ssh配置文件,此参数直接传递给ssh。

    • -i identity_file: 从指定文件中读取传输时使用的密钥文件,此参数直接传递给ssh。

    • -l limit: 限定用户所能使用的带宽,以Kbit/s为单位。

    • -o ssh_option: 如果习惯于使用ssh_config(5)中的参数传递方式,

    • -P port:注意是大写的P, port是指定数据传输用到的端口号

    • -S program: 指定加密传输时所使用的程序。此程序必须能够理解ssh(1)的选项。

  • 示例

    • 1、从本地复制到远程

    命令格式:

    scp local_file remote_username@remote_ip:remote_folder 
    或者 
    scp local_file remote_username@remote_ip:remote_file 
    或者 
    scp local_file remote_ip:remote_folder 
    或者 
    scp local_file remote_ip:remote_file 
    • 第1,2个指定了用户名,命令执行后需要再输入密码,第1个仅指定了远程的目录,文件名字不变,第2个指定了文件名;

    • 第3,4个没有指定用户名,命令执行后需要输入用户名和密码,第3个仅指定了远程的目录,文件名字不变,第4个指定了文件名;

    应用实例:

    scp /home/space/music/1.mp3 root@www.test.com:/home/root/others/music 
    scp /home/space/music/1.mp3 root@www.test.com:/home/root/others/music/001.mp3 
    scp /home/space/music/1.mp3 www.test.com:/home/root/others/music 
    scp /home/space/music/1.mp3 www.test.com:/home/root/others/music/001.mp3 

    复制目录命令格式:

    scp -r local_folder remote_username@remote_ip:remote_folder 
    或者 
    scp -r local_folder remote_ip:remote_folder 
    • 第1个指定了用户名,命令执行后需要再输入密码;

    • 第2个没有指定用户名,命令执行后需要输入用户名和密码;

    应用实例:

    scp -r /home/space/music/ root@www.tset.com:/home/root/others/ 
    scp -r /home/space/music/ www.runoob.com:/home/root/others/ 

    上面命令将本地 music 目录复制到远程 others 目录下。

    2、从远程复制到本地

    从远程复制到本地,只要将从本地复制到远程的命令的后2个参数调换顺序即可,如下实例

    应用实例:

    scp root@www.runoob.com:/home/root/others/music /home/space/music/1.mp3 
    scp -r www.runoob.com:/home/root/others/ /home/space/music/

    说明

    1.如果远程服务器防火墙有为scp命令设置了指定的端口,我们需要使用 -P 参数来设置命令的端口号,命令格式如下:

    #scp 命令使用端口号 4588
    scp -P 4588 remote@www.test.com:/usr/local/sin.sh /home/administrator

    2.使用scp命令要确保使用的用户具有可读取远程服务器相应文件的权限,否则scp命令是无法起作用的。

awk命令

  • 语法

awk [选项参数] 'script' var=value file(s)

awk [选项参数] -f scriptfile var=value file(s)

选项参数说明:

  • -F fs or --field-separator fs 指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。

  • -v var=value or --asign var=value 赋值一个用户定义变量。

  • -f scripfile or --file scriptfile 从脚本文件中读取awk命令。

  • -mf nnn and -mr nnn 对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。

  • -W compact or --compat, -W traditional or --traditional 在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。

  • -W copyleft or --copyleft, -W copyright or --copyright 打印简短的版权信息。

  • -W help or --help, -W usage or --usage 打印全部awk选项和每个选项的简短说明。

  • -W lint or --lint 打印不能向传统unix平台移植的结构的警告。

  • -W lint-old or --lint-old 打印关于不能向传统unix平台移植的结构的警告。

  • -W posix 打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符=不能代替^和^=;fflush无效。

  • -W re-interval or --re-inerval 允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。

  • -W source program-text or --source program-text 使用program-text作为源代码,可与-f命令混用。

  • -W version or --version 打印bug报告信息的版本。


  • 基本用法

log.txt文本内容如下:

2 this is a test
3 Are you like awk
This's a test
10 There are orange,apple,mongo

用法一:

awk '{[pattern] action}' {filenames}   # 行匹配语句 awk '' 只能用单引号

实例:

# 每行按空格或TAB分割,输出文本中的1、4项
 $ awk '{print $1,$4}' log.txt
 ---------------------------------------------
 2 a
 3 like
 This's
 10 orange,apple,mongo
 # 格式化输出
 $ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt
 ---------------------------------------------
 2        a
 3        like
 This's
 10       orange,apple,mongo
 

用法二:

awk -F  #-F相当于内置变量FS, 指定分割字符

实例:

# 使用","分割
 $  awk -F, '{print $1,$2}'   log.txt
 ---------------------------------------------
 2 this is a test
 3 Are you like awk
 This's a test
 10 There are orange apple
 # 或者使用内建变量
 $ awk 'BEGIN{FS=","} {print $1,$2}'     log.txt
 ---------------------------------------------
 2 this is a test
 3 Are you like awk
 This's a test
 10 There are orange apple
 # 使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割
 $ awk -F '[ ,]'  '{print $1,$2,$5}'   log.txt
 ---------------------------------------------
 2 this test
 3 Are awk
 This's a
 10 There apple

用法三:

awk -v  # 设置变量

实例:

 $ awk -va=1 '{print $1,$1+a}' log.txt
 ---------------------------------------------
 2 3
 3 4
 This's 1
 10 11
 $ awk -va=1 -vb=s '{print $1,$1+a,$1b}' log.txt
 ---------------------------------------------
 2 3 2s
 3 4 3s
 This's 1 This'ss
 10 11 10s

用法四:

awk -f {awk脚本} {文件名}

实例:

 $ awk -f cal.awk log.txt

  • 运算符

运算符
描述

= += -= *= /= %= ^= **=

赋值

?:

C条件表达式

||

逻辑或

&&

逻辑与

~ 和 !~

匹配正则表达式和不匹配正则表达式

< <= > >= != ==

关系运算符

空格

连接

+ -

加,减

* / %

乘,除与求余

+ - !

一元加,减和逻辑非

^ ***

求幂

++ --

增加或减少,作为前缀或后缀

$

字段引用

in

数组成员

过滤第一列大于2的行

$ awk '$1>2' log.txt    #命令
#输出
3 Are you like awk
This's a test
10 There are orange,apple,mongo

过滤第一列等于2的行

$ awk '$1==2 {print $1,$3}' log.txt    #命令
#输出
2 is

过滤第一列大于2并且第二列等于'Are'的行

$ awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt    #命令
#输出
3 Are you

  • 内建变量

变量
描述

$n

当前记录的第n个字段,字段间由FS分隔

$0

完整的输入记录

ARGC

命令行参数的数目

ARGIND

命令行中当前文件的位置(从0开始算)

ARGV

包含命令行参数的数组

CONVFMT

数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组

ERRNO

最后一个系统错误的描述

FIELDWIDTHS

字段宽度列表(用空格键分隔)

FILENAME

当前文件名

FNR

各文件分别计数的行号

FS

字段分隔符(默认是任何空格)

IGNORECASE

如果为真,则进行忽略大小写的匹配

NF

一条记录的字段的数目

NR

已经读出的记录数,就是行号,从1开始

OFMT

数字的输出格式(默认值是%.6g)

OFS

输出记录分隔符(输出换行符),输出时用指定的符号代替换行符

ORS

输出记录分隔符(默认值是一个换行符)

RLENGTH

由match函数所匹配的字符串的长度

RS

记录分隔符(默认是一个换行符)

RSTART

由match函数所匹配的字符串的第一个位置

SUBSEP

数组下标分隔符(默认值是/034)

$ awk 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}'  log.txt
FILENAME ARGC  FNR   FS   NF   NR  OFS  ORS   RS
---------------------------------------------
log.txt    2    1         5    1
log.txt    2    2         5    2
log.txt    2    3         3    3
log.txt    2    4         4    4
$ awk -F\' 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}'  log.txt
FILENAME ARGC  FNR   FS   NF   NR  OFS  ORS   RS
---------------------------------------------
log.txt    2    1    '    1    1
log.txt    2    2    '    1    2
log.txt    2    3    '    2    3
log.txt    2    4    '    1    4
# 输出顺序号 NR, 匹配文本行号
$ awk '{print NR,FNR,$1,$2,$3}' log.txt
---------------------------------------------
1 1 2 this is
2 2 3 Are you
3 3 This's a test
4 4 10 There are
# 指定输出分割符
$  awk '{print $1,$2,$5}' OFS=" $ "  log.txt
---------------------------------------------
2 $ this $ test
3 $ Are $ awk
This's $ a $
10 $ There $

  • 使用正则,字符串匹配

# 输出第二列包含 "th",并打印第二列与第四列
$ awk '$2 ~ /th/ {print $2,$4}' log.txt
---------------------------------------------
this a

~ 表示模式开始。// 中是模式。

# 输出包含 "re" 的行
$ awk '/re/ ' log.txt
---------------------------------------------
3 Are you like awk
10 There are orange,apple,mongo

  • 忽略大小写

$ awk 'BEGIN{IGNORECASE=1} /this/' log.txt
---------------------------------------------
2 this is a test
This's a test

  • 模式取反

$ awk '$2 !~ /th/ {print $2,$4}' log.txt
---------------------------------------------
Are like
a
There orange,apple,mongo
$ awk '!/th/ {print $2,$4}' log.txt
---------------------------------------------
Are like
a
There orange,apple,mongo

  • awk脚本

关于 awk 脚本,我们需要注意两个关键词 BEGIN 和 END。

  • BEGIN{ 这里面放的是执行前的语句 }

  • END {这里面放的是处理完所有的行后要执行的语句 }

  • {这里面放的是处理每一行时要执行的语句}

假设有这么一个文件(学生成绩表):

$ cat score.txt
Marry   2143 78 84 77
Jack    2321 66 78 45
Tom     2122 48 77 71
Mike    2537 87 97 95
Bob     2415 40 57 62

我们的 awk 脚本如下:

$ cat cal.awk
#!/bin/awk -f
#运行前
BEGIN {
    math = 0
    english = 0
    computer = 0
 
    printf "NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL\n"
    printf "---------------------------------------------\n"
}
#运行中
{
    math+=$3
    english+=$4
    computer+=$5
    printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5
}
#运行后
END {
    printf "---------------------------------------------\n"
    printf "  TOTAL:%10d %8d %8d \n", math, english, computer
    printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR
}

我们来看一下执行结果:

$ awk -f cal.awk score.txt
NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL
---------------------------------------------
Marry  2143     78       84       77      239
Jack   2321     66       78       45      189
Tom    2122     48       77       71      196
Mike   2537     87       97       95      279
Bob    2415     40       57       62      159
---------------------------------------------
  TOTAL:       319      393      350
AVERAGE:     63.80    78.60    70.00

  • 另外一些实例

AWK 的 hello world 程序为:

BEGIN { print "Hello, world!" }

计算文件大小

$ ls -l *.txt | awk '{sum+=$5} END {print sum}'
--------------------------------------------------
666581

从文件中找出长度大于 80 的行:

awk 'length>80' log.txt

打印九九乘法表

seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'

expr命令

expr命令是一个手工命令行计数器,用于在UNIX/LINUX下求表达式变量的值,一般用于整数值,也可用于字符串。

  • 语法

    expr 表达式

    表达式说明:

    • 用空格隔开每个项;

    • 用反斜杠 ** 放在 shell 特定的字符前面;

    • 对包含空格和其他特殊字符的字符串要用引号括起来

  • 示例

    1、计算字串长度

    > expr length “this is a test”
     14

    2、抓取字串

    > expr substr “this is a test” 3 5
    is is

    3、抓取第一个字符数字串出现的位置

    > expr index "sarasara"  a
     2

    4、整数运算

     > expr 14 % 9
     5
     > expr 10 + 10
     20
     > expr 1000 + 900
     1900
     > expr 30 / 3 / 2
     5
     > expr 30 \* 3 (使用乘号时,必须用反斜线屏蔽其特定含义。因为shell可能会误解显示星号的意义)
     90
     > expr 30 * 3
     expr: Syntax error

Last updated