记录一些命令的使用

grep

有些东西是真的容易忘记,不得已记录下。

grep正则:

  1. .匹配任意字符
  2. []指定范围任意字符
  3. [^]指定以外字符
  4. {m,n} 前面的字符出现m到n次
  5. *任意次
  6. +至少一次
  7. ? 0或1次
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    ^:行首锚定 写在模式最左侧
    $:行尾锚定 写在模式最右侧
    ^PATTERN$:用于PATTERN来匹配整行;
    ^$:空白行;
    ^[[:space:]]*$:空行或包含空白字符的行;

    \< 或 \b:词首锚定,用于单词模式的左侧;
    \> 或 \b:词尾锚定,用于单词模式的右侧;
    \<PATTERN\>:匹配完整单词;
    单词:非特殊字符组成的连续字符(字符串)都称为单词;

    分组及引用
    \(\):将一个或多个字符捆绑在一起,当作一个整体进行处理 反斜线表示转义
    \(xy\)*ab

    -o 只输出匹配到的内容而不是整行
    -z 跨行匹配(删除回车

    Note:
    分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为:
    \1:模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
    \2:模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
    \3
    ...

特殊字符 [:lower:] [:upper:] [:alpha:] [:alnum:] [:punct:] [:space:]

1
2
3
4
5
grep 'he.o' helloword.txt
grep '[0-9]'
grep '[0-9]\*'
grep '[0-9]\{m,n\}'
grep ^[[:space:]]*$

egrep

-G 支持基本表达式

  1. *:任意次 0,1,多次
  2. ?:0次或1次
  3. +:其前字符至少1次
  4. {m}:其前字符m次
  5. {m,n}:其前字符至少m次至多n次,{0,n},{m,}

好用的地方

  1. | 或
    1
    grep -E 'hello|world'

sort

-r 逆序
-n 数值
-k 第几列

awk/sed

1
2
3
4
5
6
sed 's/.\{8\}/&\n/g' | sed 's/^0\{6\}/0x/g' | sed 's/^0\{4\}/0x/g' | sed 's/^0\{2\}/0x/g' | tr '\n' ' ' | sed 's/ *$//g')
sed 's/\(0x[^ ]* \)\{8\}/&\n/g')
sed -e 's/[\t]*.*<//g'
awk -n '{sum=($1 + $2);printf("0x%x %s\n", sum,$3) }'
awk 'NR==1'
awk '{print NR}' | tail -1

啥时候忘了把这些命令回头康康,酸爽… awk实在是太难了,头都要秃。

shell getopt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#!/bin/bash

# A small example program for using the new getopt(1) program.
# This program will only work with bash(1)
# An similar program using the tcsh(1) script language can be found
# as parse.tcsh

# Example input and output (from the bash prompt):
# ./parse.bash -a par1 'another arg' --c-long 'wow!*\?' -cmore -b " very long "
# Option a
# Option c, no argument
# Option c, argument `more'
# Option b, argument ` very long '
# Remaining arguments:
# --> `par1'
# --> `another arg'
# --> `wow!*\?'

# Note that we use `"$@"' to let each command-line parameter expand to a
# separate word. The quotes around `$@' are essential!
# We need TEMP as the `eval set --' would nuke the return value of getopt.

#-o表示短选项,两个冒号表示该选项有一个可选参数,可选参数必须紧贴选项
#如-carg 而不能是-c arg
#--long表示长选项
#"$@"在上面解释过
# -n:出错时的信息
# -- :举一个例子比较好理解:
#我们要创建一个名字为 "-f"的目录你会怎么办?
# mkdir -f #不成功,因为-f会被mkdir当作选项来解析,这时就可以使用
# mkdir -- -f 这样-f就不会被作为选项。

TEMP=`getopt -o ab:c:: --long a-long,b-long:,c-long:: \
-n 'example.bash' -- "$@"`

if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi

# Note the quotes around `$TEMP': they are essential!
#set 会重新排列参数的顺序,也就是改变$1,$2...$n的值,这些值在getopt中重新排列过了
eval set -- "$TEMP"

#经过getopt的处理,下面处理具体选项。

while true ; do
case "$1" in
-a|--a-long) echo "Option a" ; shift ;;
-b|--b-long) echo "Option b, argument \`$2'" ; shift 2 ;;
-c|--c-long)
# c has an optional argument. As we are in quoted mode,
# an empty parameter will be generated if its optional
# argument is not found.
case "$2" in
"") echo "Option c, no argument"; shift 2 ;;
*) echo "Option c, argument \`$2'" ; shift 2 ;;
esac ;;
--) shift ; break ;;
*) echo "Internal error!" ; exit 1 ;;
esac
done
echo "Remaining arguments:"
for arg do
echo '--> '"\`$arg'" ;
done

未完待续….

Author

lyq1996

Posted on

2020-02-21

Updated on

2022-04-21

Licensed under

Comments