|
cut命令用于Linux和Unix系统中,从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。
! k( j) f" ]9 U 在本教程中,我们将通过一些实用示例来学习Linux cut命令,你可以在日常命令行活动中使用这些示例。 Cut命令和语法9 k: I' j, W8 N1 s9 q' z; b) [
7 U, [" n. f0 P. M
cut命令基本语法如下: - % m- j, y, s1 z6 ^' }( k# K
- cut OPTION... [FILE]...
复制代码
! X& B# n' M' m- n* B6 A3 ~0 w让我们看一下这个选项,没有哪个选项此命令不起作用。/ {) t4 r* v' I3 {8 B
剪切选项: -f:通过指定字段进行提取。cut命令使用“ TAB”作为默认字段分隔符。 -d:'Tab'是默认的分隔符,使用此选项可以使用特定的分隔符。 -b:通过指定一个字节来提取。也可以指定字节范围。 -c:按字符分割。这可以是用逗号分隔的数字列表,也可以是用连字符(-)分隔的数字范围。–complement:用来补充选择 –output-delimiter:要更改输出分隔符,请使用选项-output-delimiter ='delimiter'。 --only-delimited:Cut将不会输出不包含分隔符的行 在本教程中,我们将使用以下名为“ content.txt”的文本文件和/ etc / passwd文件来说明我们的示例。 - % [6 O! M) r4 ^1 }2 m
- $ cat content.txt
/ s: T5 D8 p- U, @; _ - Ubuntu Linux
! M$ s: ^6 }+ x% d9 O; x! S - Microsoft Windows' j! z$ ^4 ^. C& H; \
- OsX El Capitan
6 A W, c& [' k - Unix. Y, v6 l9 F |9 U+ @
- FreeBSD
复制代码
3 i) Y# l5 O2 ^7 J$ v0 ]3 z) L3 E, T, B/ a+ H( {- X+ m! G
如何用分隔符剪切
1 p. @. X0 J! W; K" v
# H5 s9 ~4 z7 n. S F0 ~, ~9 C; v
最常用的cut选项是-d和-f的组合,它基本上会根据特定的分隔符和列出的字段提取内容。 例如,以下仅使用分隔符( 输出'/ etc / passwd'文件中每行的第一字段。
% c8 f" B8 p' X+ Y9 D5 g! o0 M" |- $ cut -d':' -f1 /etc/passwd6 W( C! V. V9 z* k
- root2 _' Q7 g+ _* e3 k' }/ Z) t. B
- bin
5 o8 b* y6 K* e$ r. Q$ z - daemon
% K, V7 I8 O" I1 j& L - adm
3 w8 y' X! r7 g - lp) D0 ^5 C( o: y3 y
- sync
- e5 q% _% V0 ]4 t* f9 D - shutdown. s7 l7 I$ h) w" h5 E% J. K0 A' M; x
- halt9 n; n0 ^6 _) A
- mail
3 `0 a4 _0 j( D% U2 Y9 s - operator* \! b7 g. z8 n7 c
- games% H, d+ u$ j6 v; O5 u q
- ...
复制代码
) n/ z5 t2 O1 Y6 o6 O! M' C7 R在下面的示例中,我们使用空格(“”)作为分隔符,并从名为'content.txt'的文件中删除了第一个字段。
) L' L; x! S J4 L0 h! F& G Y- $ cut -d " " -f 1 content.txt ! ^" o- z, F5 O. t' L' H# r
- Ubuntu9 {" X* q3 k) A( | S& s) i
- Microsoft8 O k7 Q) w5 _; E
- OsX
# B; ~+ J0 `4 ?+ w, c - Unix9 \) k/ u1 ^7 O0 l& n% O
- FreeBSD
复制代码 . O- F8 s; v9 r$ [
本示例从特定文件中提取多个字段。在这里,我们使用冒号( 分隔符从文件“ / etc / passwd”中提取第一和第六字段,文件中包含字符串“ / bin / bash”:
' B8 D7 `. X; ?: x" m5 |- $ grep "/bin/bash" /etc/passwd | cut -d':' -f1,6
, C& \) `; D2 D) c+ D% p - root:/root. c8 v4 m1 E6 M; n8 L1 s
- slax:/home/slax
复制代码 & Y5 n% P1 d8 G- d' `! U
要显示字段范围,请指定以hypen(-)分隔的开始字段和结束字段,如下所示: - $ a( P# h. A$ k+ `6 G1 G' B3 W
- $ grep "/bin/bash" /etc/passwd | cut -d':' -f1-4,6,72 N( [, E- M6 ?2 p. D: e+ H
- root:x:0:0:/root:/bin/bash# B$ p0 D: a$ t T% E# @0 B. o
- slax:x:1000:1000:/home/slax:/bin/bash
复制代码
/ @5 s0 T9 r: ]$ [+ I) T. a3 T8 h9 L6 j- I9 J7 E" p' F
如何补充输出选择9 M- o" \# f4 u( O6 j
+ P1 V6 Z8 L' I
7 ]5 ~0 {' w, n$ @% s2 n
要补充选择字段列表,请使用--complement选项。此选项用于在何处选择除指定字段以外的所有字段。3 M( q5 }# l1 Y4 A3 b, r, y
在下面的示例命令中,将输出'/ etc / passwd'文件中第二个字段以外的所有字段:
2 p; `% I% B; E* r- d- $ grep "/bin/bash" /etc/passwd | cut -d':' --complement -f2+ f4 v" I+ G9 i2 d
- root:0:0:root:/root:/bin/bash
复制代码
' N* v, x: y/ D! R, L. E1 Q5 K如何指定输出分隔符 要指定输出分隔符,请使用--output-delimiter选项。输入分隔符由-d选项指定,默认情况下,输出分隔符与输入分隔符相同。
; X& ], b; P/ p& T% C 让我们首先看下输出不使用输出分隔符的情况,如下所示:
9 H% h/ f+ D' K. _2 R5 V2 R7 q& V Q- $ cut -d: -f1,7 /etc/passwd | sort | uniq -u
. t: P( a# [& c2 P0 F! Q& J - _apt:/usr/sbin/nologin
' G8 V- ]. W. E' g - backup:/usr/sbin/nologin: M' g. r, }& @; |" u* `
- bin:/usr/sbin/nologin
T& I2 @* b+ h& e5 U V - daemon:/usr/sbin/nologin
0 J: `. T _; ]) }/ B - dnsmasq:/usr/sbin/nologin; N2 E( M' ]) C/ q1 b
- games:/usr/sbin/nologin, ]( ^4 O% O% {' r
- gnats:/usr/sbin/nologin
" g, C9 k; r( E8 g7 ]+ ^ - irc:/usr/sbin/nologin
5 W7 |7 D1 S1 f; T& s1 q - landscape:/usr/sbin/nologin0 H0 v$ ^0 X* X+ @
- list:/usr/sbin/nologin& w8 {! V# u* @9 Z w* x
- lp:/usr/sbin/nologin5 k+ Y* I$ O: \4 Z
- lxd:/bin/false
复制代码
# [' [' p- j1 r' I( ~7 s; f现在,我添加了--output-delimiter选项,并将输入分隔符冒号( 替换为输出分隔符“ SPACE”,如下所示: - . i M& N. \5 i4 K) Z
- $ cut -d: -f1,7 --output-delimiter ' ' /etc/passwd | sort | uniq -u3 {( v& [$ {+ e/ D
- _apt /usr/sbin/nologin% t( u s5 I5 ?7 u0 F" g2 ^- B4 U
- backup /usr/sbin/nologin
/ e& W: Z! a Z8 w* ^" ^/ e' Y - bin /usr/sbin/nologin
! z% ~% }' l. E0 G# e: h/ ]# a' W - daemon /usr/sbin/nologin
9 [# Y. W' z4 m: G+ L& X - dnsmasq /usr/sbin/nologin- o N3 \+ f1 R& N9 s) K
- games /usr/sbin/nologin. c [' ^" \' `$ e" G' m$ |) f
- gnats /usr/sbin/nologin
4 c4 w# W0 X9 p( h/ _ - irc /usr/sbin/nologin% [0 x( y: h2 O+ q
- landscape /usr/sbin/nologin
$ B5 ~# J% z, @' Z1 Y - list /usr/sbin/nologin! T8 Y% g1 j. Q g% n: v; D I; z
- lp /usr/sbin/nologin. |0 y6 u2 `( z0 q. m
- lxd /bin/false
复制代码
; m: K; i, u# G4 t* g$ t" p% K让我们看下另一个示例,这里我们使用输出分隔符输出在新行的每个字段上。" x1 i3 W- F* |. k1 E
在这里,我们将--output-delimiter用作$’\ n’,表示新行。 输出如下:
. d' H. c2 @$ o$ Z0 t- $ grep root /etc/passwd | cut -d':' -f1,6,7 --output-delimiter=
1 b% Z0 W! M1 q, j" j1 U9 ^4 O8 e7 j - [/font][/backcolor][/color][/align][align=left][color=#001000][backcolor=rgb(255, 255, 255)]3 C2 S& g5 o! d8 V! F- j
- [/backcolor][/color][/align][font=Tahoma][b]如何按字符剪切[/b][/font][font=Tahoma]2 X5 s9 F: }7 b' |/ ?. V
- [/font]
7 o7 a2 B% s( E2 V' l/ P - [align=left][color=#001000][backcolor=rgb(255, 255, 255)]' k( ]5 o: n" R+ {+ w, m' C7 q
- [/backcolor][/color][/align][align=left][color=#001000][backcolor=rgb(255, 255, 255)][font=Tahoma]用于按字符位置剪切。请记住,“ TABS”和“空格”也被视为字符。[/font]
8 `6 d6 U1 V# D - [/backcolor][/color][/align][align=left][color=#001000][backcolor=rgb(255, 255, 255)][font=Tahoma]要从名为content.txt的文件的每一行输出第一个字符,请使用以下命令:[/font][/backcolor][/color][/align][align=left][color=#001000][backcolor=rgb(255, 255, 255)][font=Tahoma][code]
4 B4 l; c8 i0 _ - $ cut -c 1 content.txt) d2 F( z: X9 q5 z) t/ J) F
- U
; _- D* v. c3 P) G" A# _0 f { - M" N8 v/ b3 S' t# x5 B( p$ I# g
- O# ?3 ^0 @: q4 F& N0 u- n* \6 ]
- U% ]2 @. g7 l2 u. ?5 G, x
- F
复制代码
& j& j0 j0 u& f- g, W! l在下面的示例中,我们将显示文件中每行的字符1至7(范围): - ) r. v2 W- N: o1 e: ^# d" _
- $ cut -c 1-7 content.txt
& ] Q, g4 [6 |, m! U$ l: m9 A - Ubuntu
7 x- k8 N# l4 X T# ^ - Microso. U4 c. f$ a5 U7 Q( n5 e! I0 V
- OsX El
9 `- V R- d% f) Z7 X - Unix
( c0 L7 B. X: E - FreeBSD
复制代码
( e; G6 }7 y I& @* c让我们看看如何通过特定的开始或结束位置来选择列。
2 m; j. k Z; J" \ 要将列从第二个字符提取到最后一个字符: - " \& R8 E" o" A4 Y. v. O# m
- $ cut -c2- content.txt+ P5 K7 R. D6 j
- buntu Linux
4 U- h$ M3 p, ?9 p' h% h$ q - icrosoft Windows
2 h. `+ ?0 M6 h2 w - sX El Capitan5 K' b& q: |6 ^4 V
- nix
) Y D% X: b' B ?8 ^/ p - reeBSD
复制代码 , t8 Q0 k$ G2 b6 D9 v
要从第一个字符到第四个字符提取列: - 6 v& x4 v9 ]# v! z4 P6 U- X! Q n$ W
- cut -c-4 content.txt
: a$ ~1 D) `# ^* P T - Ubun8 M0 e; g, h; d* Y6 ~1 Z7 L
- Micr
1 Q9 V0 Z/ d6 T" I" L- E$ A* j - OsX4 f1 m, k( Q1 C. O/ t& k% K
- Unix6 |5 p/ E2 \' \# h) ?' T! b
- Free
复制代码
% |& S; b0 M: u4 z e7 ~, {; J 如何按照字节剪切9 P. J8 C9 z1 O) g: N2 `) \
! |# s8 F2 B( z( d) j7 p9 e: }0 l0 s
使用-b选项通过用逗号(,)分隔的数字指定字节位置来选择一行中的一部分。使用连字符可以指定字节范围。) v2 X8 d5 \: |. @) u7 d$ c; y
以下示例从名为“ content.txt”的文件的第1、2和3个字节切出: - + t; a" c# |. }0 X; {4 R
- $ cut -b 1,2,3 content.txt
! @0 x9 x1 I3 z2 J+ p) p - Ubu- [. P' |" W& A
- Mic
* i3 ~4 e9 }! ~8 a, V! {! _7 e - OsX
5 ^& l- t7 k. X - Uni
8 f% C/ ?- J5 |& |* g! E/ S5 q - Fre
复制代码
0 K6 G7 g& F$ J# c! A/ E我们还可以使用以下命令列出范围:
0 o; D; |7 h! @% p3 ^9 L I- $ cut -b 1-3,5-7 content.txt
& \2 ^* r9 R+ ?1 p( ^: H4 e% c, ~* r - Ubutu ; d- ]8 ]2 L: |
- Micoso6 k- v: O( ]) A: U: N6 W% M
- OsXEl
2 p2 J% {( l4 z - Uni1 t+ m6 S' H/ }6 }- E
- FreBSD
复制代码 % N: a0 K* u* ~) v5 k8 b. t; V
+ h7 y4 u( F" ?4 F1 I* z 一些实用的示例1 l- \7 g1 X6 F; H
8 K9 K! D( w2 j
. K; R2 y+ `7 ^. b5 U: k# v
Cut是结合不同的Linux或Unix命令最实用的方法。( i& q2 w! {2 \( D# h" q* |
例如,您要使用ps命令提取“ USER”,“ PID”和“ COMMAND”如下:
1 Y( x* y. @: s2 X5 l- ps -L u n | tr -s " " | cut -d " " -f 2,3,14-
% f& |( ]+ @' G9 X - USER PID COMMAND; N3 d2 d: p7 f, x# n
- 0 676 /sbin/agetty -o -p -- \u --keep-baud 115200,38400,9600 ttyS0 vt220; `, _8 \9 C* s" S ?- @" \
- 0 681 /sbin/agetty -o -p -- \u --noclear tty1 linux9 S- A. l1 _5 g6 G
- 0 23174 -bash
2 _0 q, \& c- R5 ~% h. n - 0 26737 ps -L u n6 N( i( V U: L8 B5 Y
- 0 26738 tr -s/ J0 f1 O8 ]0 K
- 0 26739 cut -d -f 2,3,14-
复制代码 $ a2 U/ z/ n$ t/ ~: f/ R+ M
让我们再举一个例子来提取内存的“ total”、“ used”和“ free”值,并使用多个命令将其保存到文本文件中: - ; A1 A; c5 A8 j, R
- $ free -m | tr -s ' ' | sed '/^Mem/!d' | cut -d" " -f2-4 >> memory.txt
, E9 G R; V5 @$ x' k - Output ] j/ r5 F) V# h
- $ cat memory.txt
* u# p5 I/ ~. N! @ ~! U0 u - 985 86 234
复制代码
! h7 e% X8 i# B2 w) f7 s
0 B# E- W% `* a' c7 O4 X: s 结论6 Y+ q G& \" T9 L
% @4 }* v' M* x2 Z) a8 d
" }7 @8 p* O1 I8 j/ l' p
cut命令可以与许多其他Linux或Unix命令一起传递。可以通过管道传递一个或多个过滤器以进行其他文本处理。
, ~) C$ w! s' I1 U- ] cut命令的局限性之一是它不支持指定多个字符作为分隔符。多个空格会被计为多个字段分隔符,必须在剪切前使用tr命令才能获得所需的输出。
2 {$ d+ k! q$ `( l' v\n'
( `3 {8 I$ Q. b J( A" groot: r3 U% e! |; k
/root: E% j5 G! Z4 N2 r
/bin/bash* m7 i9 V) W( ~+ o8 A% D
operator/ B' e4 Y2 M* c5 G* Q: e3 l
/root2 @2 i f6 h! b1 _9 F
/sbin/nologin[/code]. t6 {- R/ I4 ]" }" |0 F
4 w T+ b- V* h9 _: D/ k7 C 如何按字符剪切3 ^# U+ \* o/ S t, y" g' I
. E4 B1 u- R$ m$ D
" x2 Y# E P) i. T
用于按字符位置剪切。请记住,“ TABS”和“空格”也被视为字符。
9 t2 D7 r6 z9 J6 s y4 M 要从名为content.txt的文件的每一行输出第一个字符,请使用以下命令:
4 h. ]# T2 T) T+ |, I- $ cut -c 1 content.txt9 H0 i! `, H& q: n
- U
/ ^9 d% X0 n9 L% F - M
1 ^) o( I7 Q8 R0 {) L8 Y - O9 ` l- p" p, X) R
- U8 C8 Q7 [; `. h) b$ }' L5 P$ S1 l
- F
复制代码 ' K3 _5 K6 O, H A
在下面的示例中,我们将显示文件中每行的字符1至7(范围):
0 }" d& h7 o7 X" a) ~5 h- $ cut -c 1-7 content.txt j; @( e% }0 ~4 O* J+ p( s
- Ubuntu4 c6 t* Y; `7 e- {
- Microso9 L% V2 ?1 d4 c, i
- OsX El W; {( }3 L1 i7 V+ n0 `
- Unix
6 A2 z8 {3 n3 M/ z* f - FreeBSD
复制代码 2 u# {! V5 s) M# y% w8 f5 ?
让我们看看如何通过特定的开始或结束位置来选择列。5 U2 c. H9 e' ?% A) X
要将列从第二个字符提取到最后一个字符:
o- Y/ j) g( N- H \1 e- $ cut -c2- content.txt; x4 {- W( S* L
- buntu Linux
" j2 P* H. g8 M' |+ }1 |- u* f6 h& K - icrosoft Windows, z/ u2 C9 B4 f0 p
- sX El Capitan" r8 \, B, w, `7 G7 D9 [5 [/ ^$ z
- nix/ H. V" g) D$ m
- reeBSD
复制代码
! e- v3 t, M7 j2 r& L/ C G; U要从第一个字符到第四个字符提取列: - + { L) [1 Y$ b
- cut -c-4 content.txt
" M I3 z. D: ]3 z - Ubun# N0 I6 b$ J% e) W9 H
- Micr2 m# w. c9 f+ |" V6 | G5 X
- OsX
. k$ v% m$ ~# d t - Unix
( H1 I) f! y: g! D' G9 T- P - Free
复制代码
. r9 R H% z; P 如何按照字节剪切8 R% s, ?5 M4 |, e7 Y+ b
/ p' q5 Z$ r: m3 @7 L, A3 k
8 w- \6 s4 h: A, y
使用-b选项通过用逗号(,)分隔的数字指定字节位置来选择一行中的一部分。使用连字符可以指定字节范围。 M' J( a0 Z/ R' u5 W- Y! g+ P
以下示例从名为“ content.txt”的文件的第1、2和3个字节切出:
! E, P# q. n$ T a3 n, T- $ cut -b 1,2,3 content.txt / [' \9 T7 q8 C# a7 u' h
- Ubu0 e' A5 H! m# K4 _8 Q. A- p2 o
- Mic
" x/ H3 p! |$ t, _% w$ F, M - OsX
' h) q. ]7 ^: W - Uni- P9 H8 t& l8 Y# B! Z
- Fre
复制代码 1 z; {8 I( ]( V2 W+ B% x, n
我们还可以使用以下命令列出范围: - ; Y$ X4 K1 i0 }$ v" u' h1 Z+ w9 \; D
- $ cut -b 1-3,5-7 content.txt : d3 p* p. T9 w7 |# }
- Ubutu
- W8 t% d, r3 E: X: W! Q/ x - Micoso2 g0 _ y N" W' a
- OsXEl
4 R# L; e- o7 T/ {1 C9 b' v - Uni
1 K* x& @1 k. w) }- ]% i/ N - FreBSD
复制代码 # i. H* m/ r9 i/ N
1 F) K9 C4 ^. O0 d 一些实用的示例! H9 ?8 r: m& l3 k d [- D& @5 t8 h
( J2 x) U5 e: ~0 B( |5 Z- a6 v
4 r8 B( A0 D0 V5 C( B" K) E
Cut是结合不同的Linux或Unix命令最实用的方法。
. H4 l6 v0 u0 _+ A 例如,您要使用ps命令提取“ USER”,“ PID”和“ COMMAND”如下:
9 f2 ?% A7 B" `3 v+ H6 Q- ps -L u n | tr -s " " | cut -d " " -f 2,3,14-3 j8 E5 u& D4 l% I t; F
- USER PID COMMAND
( ^! }! L9 w) x) L* i - 0 676 /sbin/agetty -o -p -- \u --keep-baud 115200,38400,9600 ttyS0 vt220! N( b1 A" G1 y1 R4 C9 i
- 0 681 /sbin/agetty -o -p -- \u --noclear tty1 linux
2 ?- S, R1 ]3 d( Y( [( `+ V7 n( O7 v - 0 23174 -bash0 W! N' s) M$ l K+ F ^7 C4 v
- 0 26737 ps -L u n
+ R, o$ y+ K `. M. J- d! o5 U - 0 26738 tr -s
, B. u( j }, L, x5 o9 N - 0 26739 cut -d -f 2,3,14-
复制代码 : {7 J6 C6 [+ r; r6 g9 `
让我们再举一个例子来提取内存的“ total”、“ used”和“ free”值,并使用多个命令将其保存到文本文件中: - . X; f: r- } P+ A
- $ free -m | tr -s ' ' | sed '/^Mem/!d' | cut -d" " -f2-4 >> memory.txt1 C, W/ ?7 }9 w0 G
- Output
3 I5 [9 Q+ w) N- U/ a - $ cat memory.txt
, W- k4 J7 B `2 a7 ]" Y( h( {1 T - 985 86 234
复制代码
g2 l7 i2 r6 d# Y9 X+ J5 [
' Y0 ~. U3 F- X! K 结论
2 T s4 W6 G2 t4 e: R; Z
0 K; L$ f+ s/ N* d9 }
/ w1 Q6 Q" R. s" {0 z$ d
cut命令可以与许多其他Linux或Unix命令一起传递。可以通过管道传递一个或多个过滤器以进行其他文本处理。. X/ [& T% o! r. i" w9 ~
cut命令的局限性之一是它不支持指定多个字符作为分隔符。多个空格会被计为多个字段分隔符,必须在剪切前使用tr命令才能获得所需的输出。
- B" n1 r) S. K( d9 H; i0 @ |