shell语法

一、语法

1. wc

 # 统计文件的行数、字数和字节数
- wc file.txt
 # 只统计文件的行数
wc -l file.txt
 # 只统计文件的字数
wc -w file.txt
 # 只统计文件的字节数
wc -c file.txt

2. |

在 shell 脚本中, | 是一个管道符号,用于将一个命令的输出传递给另一个命令进行处理。它可以将前一个命令的输出作为后一个命令的输入,实现多个命令的组合操作。
以下是一个示例,展示了如何使用 | 进行命令的管道操作:
shell
command1 | command2
在上述示例中, command1 的输出会作为 command2 的输入进行处理。这样可以实现对数据的连续处理。
例如,假设我们有一个文件 file.txt ,我们想要统计文件中包含特定关键词的行数,可以使用 grep 命令和 wc 命令结合管道操作来实现:
shell
grep “keyword” file.txt | wc -l
上述命令会先使用 grep 命令筛选出包含关键词 “keyword” 的行,然后将筛选结果传递给 wc 命令进行行数统计。

3. awk

awk 是一种文本处理工具,可以逐行处理输入文本并执行相应的操作

  • -F :指定字段分隔符。
    示例: awk -F’,’ ‘{print $1}’ file.txt ,解释:先将文件的每一行按‘,’分割,然后通过$1获取逗号前的部分
  • -v :定义一个变量并赋值。
    示例: awk -v var=10 ‘{print $1 + var}’ file.txt
  • -f :从文件中读取 awk 脚本。
    示例: awk -f script.awk file.txt
  • -v RS :指定记录分隔符。
    示例: awk -v RS=‘###’ ‘{print $0}’ file.txt
  • -v FS :指定字段分隔符。
    示例: awk -v FS=‘,’ ‘{print $1}’ file.txt
  • -v OFS :指定输出字段分隔符。
    示例: awk -v OFS=‘|’ ‘{print $1, $2}’ file.txt
  • -v ORS :指定输出记录分隔符。
    示例: awk -v ORS=‘\n\n’ ‘{print $0}’ file.txt
  • -v CONVFMT :指定数字转换格式。
    示例: awk -v CONVFMT=‘%.2f’ ‘{print $1}’ file.txt
    举例:awk '{print $1}'wc -l ./nowcoder.txt | awk '{print $1}'

awk '{print $1}' 是一个用于在shell中使用awk命令的示例。awk是一种强大的文本处理工具,可以用于按列对文本进行操作和处理。
在这个示例中, awk '{print $1}' 的含义是提取每行的第一个字段,并将其打印输出。默认情况下,awk使用空格作为字段的分隔符,因此它会将每行文本拆分为多个字段,然后打印第一个字段。
例如,假设有一个名为 data.txt 的文本文件,内容如下:
apple orange banana
cat dog bird
运行以下命令:
shell
awk ‘{print $1}’ data.txt
输出将会是:
apple
cat
在输出中,每行的第一个字段被提取并打印出来。

4. grep

grep 是一个常用的文本搜索工具,用于在文件或输入流中查找匹配指定模式的行。下面是一些常用的 grep 参数的解释和示例:

  • -c :仅输出匹配行的计数。
    示例:`grep -c “pattern” file.txt
  • -i :忽略大小写,不区分大小写地匹配模式。
    示例: grep -i “pattern” file.txt
  • -v :反向匹配,输出不匹配模式的行。
    示例: grep -v “pattern” file.txt
  • -n :显示匹配行的行号。
    示例: grep -n “pattern” file.txt
  • -r :递归搜索,搜索指定目录及其子目录下的文件。
    示例: grep -r “pattern” directory
  • -l :仅输出匹配模式的文件名,而不显示匹配行。
    示例: grep -l “pattern” file.txt
  • -e :指定多个模式,可以使用多个 -e 参数。
    示例: grep -e “pattern1” -e “pattern2” file.txt
    匹配字符串为 "pattern1"或"pattern2"的行
  • -f :从文件中读取模式,每行一个模式。
    示例: grep -f patterns.txt file.txt
  • -w :匹配整个单词,而不是部分匹配。
    示例: grep -w “word” file.txt
  • -A :显示匹配行及其后面的几行。
    示例: grep -A 2 “pattern” file.txt
  • -B :显示匹配行及其前面的几行。
    示例: grep -B 2 “pattern” file.txt
  • -C :显示匹配行及其前后几行。
    示例: grep -C 2 “pattern” file.txt`
    这些参数可以根据具体需求来组合使用,以实现更灵活的文本搜索和处理。

练习举例:

  • grep -c "" ./nowcoder.txt
    grep -c "" ./nowcoder.txt 是一个命令行命令,用于计算文件 “nowcoder.txt” 中匹配空字符串的行数。 grep 是一个文本搜索工具, -c 参数表示只输出匹配行的计数结果。空字符串 “” 作为搜索模式,表示匹配所有行。 ./nowcoder.txt 是要搜索的文件路径。
    因此,这个命令的作用是计算文件 “nowcoder.txt” 中的行数。

5. tail

tail 命令用于显示文件的末尾内容。下面是一些常用的 tail 参数的含义和示例:

  • -n NUM :显示文件末尾的最后 NUM 行。
    示例: tail -n 10 file.txt 显示文件 “file.txt” 的最后 10 行。
  • -f :实时追踪文件的增长,显示新添加的内容。
    示例: tail -f file.txt 实时显示文件 “file.txt” 的末尾内容,并随着文件的增长自动更新。
    tail -f 是一个常用的命令行命令,用于实时监视文件的变化并输出新添加的内容。下面是一个示例和解释:
    假设有一个名为 “logfile.txt” 的日志文件,我们希望实时监视该文件的变化并输出新添加的内容,可以使用以下命令:
    tail -f logfile.txt
    这个命令将会持续不断地输出 “logfile.txt” 文件的末尾内容,并保持对文件的监视。当有新的内容被添加到文件中时, tail -f 命令会自动将新内容输出到终端。
    通过使用 tail -f 命令,我们可以在实时的情况下查看日志文件的更新,特别适用于监控日志文件、调试和追踪文件变化等场景。
  • -c NUM :显示文件末尾的最后 NUM 个字节。
    示例: tail -c 100 file.txt 显示文件 “file.txt” 的最后 100 个字节。
  • -q :静默模式,不显示文件名。
    示例: tail -q file1.txt file2.txt 静默模式显示文件 “file1.txt” 和 “file2.txt” 的末尾内容,不显示文件名。
  • -v :详细模式,显示文件名。
    示例: tail -v file.txt 详细模式显示文件 “file.txt” 的末尾内容,并显示文件名。

6. sed

sed 是一个流编辑器,用于对文本进行处理和转换。它可以根据指定的规则对输入文本进行模式匹配,并执行相应的操作。
sed 命令的基本语法如下:
sed [options] ‘command’ file
其中, options 是可选的参数,用于指定不同的操作模式和选项; command 是要执行的 sed 命令; file 是要处理的输入文件。
下面是一些常用的 sed 参数和选项的解释:

  • -n :只输出经过处理的行,不显示所有行。
  • -e :允许在命令行上指定多个编辑命令。
  • -i :直接修改文件内容,而不是将结果输出到标准输出。
  • -r (或 -E ):启用扩展正则表达式语法。
  • -f :从指定的文件中读取编辑命令。
    sed 命令中的 command 部分是用于指定要执行的编辑命令,可以是单个命令或多个命令的组合。常见的命令包括:
  • s/pattern/replacement/ :替换匹配到的文本。
  • d :删除匹配到的行。
  • p :打印匹配到的行。
  • i :在指定行之前插入文本。
  • a :在指定行之后追加文本。
    这只是 sed 命令的一小部分功能,还有许多其他的命令和选项可供使用。您可以通过查阅 sed 的文档或使用 man sed 命令来获取更详细的信息和示例。
    $=

在Shell中, sed 命令是一个流编辑器,用于对文本进行编辑和转换。 $=sed 命令中的一个特殊用法,用于打印出当前行的行号。
下面是一个 sed 命令中 $= 的示例及解释:
假设有一个名为 file.txt 的文件,内容如下:
Hello
World
This is a test
我们可以使用以下 sed 命令来打印每行的行号:
shell
sed ‘=’ file.txt
输出结果为:
1
Hello
2
World
3
This is a test
解释:
= 命令用于打印出当前行的行号。
sed '=' file.txt 命令将逐行读取 file.txt 文件的内容,并在每行之前打印出行号。
因此, sed 命令中的 $= 用于打印当前行的行号。

'='是在每行数据前打印行号,$=是值打印最后一行的行号,并且在最后一行的上一行打印。
举例:
sed -n '$=' ./nowcoder.txt

  • sed -n '$=' ./nowcoder.txt是一个命令行命令,用于计算文件 “nowcoder.txt” 中的行数。 sed 是一个流编辑器, -n 参数用于禁止默认的输出,只输出经过处理的行。 ‘$=’ 是 sed 的命令,用于在每一行的末尾输出行号。 ./nowcoder.txt 是要处理的输入文件路径。
  • 因此,这个命令的作用是计算文件 “nowcoder.txt” 中的行数,并将结果输出。 $= 命令会在每一行的末尾输出行号,而 -n 参数则只输出经过处理的行,即最后一行的行号。

7. x

x"$PID"的作用是确保变量PID不为空。这种做法主要是为了避免在比较运算符(如!=)中使用一个空变量时引发的语法错误。

在Shell中,如果一个变量是空的,直接使用$PID会导致语法上的问题,因为这可能会被解释为缺少操作数。通过将字符x与变量PID拼接在一起,x"$PID"的值将始终是一个非空字符串,即使变量PID为空。

这种做法可以确保条件表达式在比较时不会出现语法错误或意外的结果。所以,x"$PID"实际上只是一个惯用的方法,没有具体含义,其目的是为了提供一种可靠的方式来处理变量是否为空的情况。

8. java的jar包启动命令

参考:链接
举例:nohup java -jar common-api.jar >log.out 2>&1 &
解释:

  • nohup:nohub关键字,这样程序就会不挂断运行命令, 当ssh终端关闭时,程序仍然在运行
  • >log.out:标准输出
  • 2>&1:标准错误输出(stderror)由于重用了标准输出的描述符
  • &:在当窗口关闭时,程序也会中止运行

二、内置变量

1. NR

举例:awk '{print NR}' ./nowcoder.txt

  • NR 是 AWK 内置的变量,表示当前处理的行号。所以这个命令的意思是打印出输入文件的每一行的行号。

三、练习题

1. awk ‘{print NR}’ ./nowcoder.txt |tail -n1

  • 它会读取名为 “nowcoder.txt” 的文件,并打印出文件中的行号。然后通过管道操作符 | 将输出传递给 tail -n1 命令,该命令会显示传递给它的输入的最后一行。因此,整个命令的作用是打印出文件 “nowcoder.txt” 的最后一行的行号。
  • NR 是 AWK 内置的变量,表示当前处理的行号。所以这个命令的意思是打印出输入文件的每一行的行号。

2. awk ‘END{print NR}’ ./nowcoder.txt

  • awk 是一种文本处理工具,可以逐行处理输入文本并执行相应的操作。
  • ‘END{print NR}’ 是 AWK 的程序代码部分,其中 END 是一个特殊的模式,表示在处理完整个文件后执行的操作。 {print NR} 是在 END模式下执行的动作,其中 NR 是 AWK 内置的变量,表示当前处理的行号。
  • ./nowcoder.txt 是要处理的输入文件路径。
    因此,这个命令的作用是使用 AWK 处理文件 “nowcoder.txt”,并在处理完整个文件后打印出文件的总行数。

你可能感兴趣的:(Linux,linux,服务器,运维)