Linux 下使用cut命令,實現更好切分數據

cut是什麼

  • 一個Unix終端命令
  • 切割行內容,並進行標準輸出
  • 可以按照字節,字符,分隔符進行切分

能有什麼用

我們舉一個簡單的例子(非全部示例)來描述cut有什麼用,可以做什麼

簡潔輸出,去除干擾冗餘信息

比如這個日誌,可能會出現折行,另外假設04-19 18:26:55.605 22750 22883 W這些列的信息屬於干擾信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
04-19 18:26:55.605 22750 22883 W System.err: java.lang.NoSuchFieldException
04-19 18:26:55.605 22750 22883 W System.err:  at com.xiaomi.push.au.a(Unknown Source:16)
04-19 18:26:55.605 22750 22883 W System.err:  at com.xiaomi.push.au.a(Unknown Source:4)
04-19 18:26:55.605 22750 22883 W System.err:  at com.xiaomi.push.service.z.a(Unknown Source:880)
04-19 18:26:55.605 22750 22883 W System.err:  at com.xiaomi.push.service.z.a(Unknown Source:188)
04-19 18:26:55.605 22750 22883 W System.err:  at com.xiaomi.push.service.p.a(Unknown Source:821)
04-19 18:26:55.605 22750 22883 W System.err:  at com.xiaomi.push.service.p.a(Unknown Source:605)
04-19 18:26:55.605 22750 22883 W System.err:  at com.xiaomi.push.service.p.a(Unknown Source:11)
04-19 18:26:55.605 22750 22883 W System.err:  at com.xiaomi.push.service.d.a(Unknown Source:46)
04-19 18:26:55.605 22750 22883 W System.err:  at com.xiaomi.push.service.ak.b(Unknown Source:50)
04-19 18:26:55.605 22750 22883 W System.err:  at com.xiaomi.push.service.ak.a(Unknown Source:10)
04-19 18:26:55.605 22750 22883 W System.err:  at com.xiaomi.push.service.XMPushService$c.a(Unknown Source:8)
04-19 18:26:55.605 22750 22883 W System.err:  at com.xiaomi.push.service.XMPushService$i.run(Unknown Source:37)
04-19 18:26:55.605 22750 22883 W System.err:  at com.xiaomi.push.service.g$c.run(Unknown Source:175)
04-19 18:27:24.787 23660 23685 W System.err: load vdr indoor lib success.

使用cut 我們可以實現刪除上面的冗餘信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
adb logcat | grep "System.err" --line-buffered | cut -d " " -f 6-
System.err: java.lang.NoSuchFieldException
System.err:   at com.xiaomi.push.au.a(Unknown Source:16)
System.err:   at com.xiaomi.push.au.a(Unknown Source:4)
System.err:   at com.xiaomi.push.service.z.a(Unknown Source:880)
System.err:   at com.xiaomi.push.service.z.a(Unknown Source:188)
System.err:   at com.xiaomi.push.service.p.a(Unknown Source:821)
System.err:   at com.xiaomi.push.service.p.a(Unknown Source:605)
System.err:   at com.xiaomi.push.service.p.a(Unknown Source:11)
System.err:   at com.xiaomi.push.service.d.a(Unknown Source:46)
System.err:   at com.xiaomi.push.service.ak.b(Unknown Source:50)
System.err:   at com.xiaomi.push.service.ak.a(Unknown Source:10)
System.err:   at com.xiaomi.push.service.XMPushService$c.a(Unknown Source:8)
System.err:   at com.xiaomi.push.service.XMPushService$i.run(Unknown Source:37)
System.err:   at com.xiaomi.push.service.g$c.run(Unknown Source:175)

按照字節切分(cut -b)

按照字節位置切分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 取第一個字節
[email protected]:~ $ echo "abcdef" | cut -b 1
a


# 取第二個字節
[email protected]:~ $ echo "abcdef" | cut -b 2
b


# 從1開始,0會報錯
[email protected]:~ $ echo "abcdef" | cut -b 0
cut: byte/character positions are numbered from 1
Try 'cut --help' for more information.

按照字節區間切分

1
2
3
4
5
6
7
8
9
10
11
#1到2字節位置切分
[email protected]:~ $ echo "abcdef" | cut -b 1-2
ab

# 限定區間起始位置,不限定結束位置
[email protected]:~ $ echo "abcdef" | cut -b 1-
abcdef

# 限定區間結束位置,但不限定起始位置
[email protected]:~ $ echo "abcdef" | cut -b -5
abcde

按照字節多個位置切分

1
2
[email protected]:~ $ echo "abcdef" | cut -b 1,3,5
ace

按照字符區分

當我們按照字符進行切分時,會遇到一些問題,比如出現中文的時候(一箇中文佔用三個字節)

1
2
3
4
5
6
7
# 異常出現
echo "小黑屋" | cut -b 1

##必須限定滿足正確的開始和結束位置
echo "小黑屋" | cut -b 1-3

但是如果中英文並存,就比較麻煩了,好在有按照字符切分的方法(cut -c)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
echo "abcd技術小黑屋ef" | cut -c 7

echo "abcd技術小黑屋ef" | cut -c 7-9
小黑屋

echo "abcd技術小黑屋ef" | cut -c 7,8,9
小黑屋

echo "abcd技術小黑屋ef" | cut -c 5-
技術小黑屋ef

echo "abcd技術小黑屋ef" | cut -c -9
abcd技術小黑屋

按照分隔符切分(cut -d )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
echo "A|BC|DEF|GHIJ" |  cut -d "|" -f 1
A

echo "A|BC|DEF|GHIJ" |  cut -d "|" -f 2
BC

echo "A|BC|DEF|GHIJ" |  cut -d "|" -f 3
DEF

# 區間,限定開始位置
echo "A|BC|DEF|GHIJ" |  cut -d "|" -f 1-
A|BC|DEF|GHIJ

#區間,限定結束位置
echo "A|BC|DEF|GHIJ" |  cut -d "|" -f -3
A|BC|DEF

# 區間,限定開始和結束位置
echo "A|BC|DEF|GHIJ" |  cut -d "|" -f 1-2
A|BC

#提供多個位置
echo "A|BC|DEF|GHIJ" |  cut -d "|" -f 1,2
A|BC

注意

  • 上面爲了示例簡單實用了echo 加管道的方式
  • 上面所有的例子,都可以實用類似加文件的形式
  • 比如cut -b 1 test_cut_file.txt,cut -c 1 test_cut_file.txt,cut -d "|" -f 1 test_cut_file.txt

更多

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章