Cách sử dụng lệnh cut Linux

Tác giả NetworkEngineer, T.Mười 03, 2022, 04:04:00 CHIỀU

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 1 Khách đang xem chủ đề.

Cách sử dụng lệnh cut Linux


Lệnh Linux cutcho phép bạn trích xuất các phần văn bản từ các tệp hoặc luồng dữ liệu. Nó đặc biệt hữu ích để làm việc với dữ liệu được phân tách, chẳng hạn như tệp CSV. Đây là những gì bạn cần biết.


1. Lệnh cut

Lệnh cutnày là một cựu binh của thế giới Unix, ra mắt lần đầu tiên vào năm 1982 như một phần của AT&T System III UNIX. Mục đích của nó trong cuộc sống là cut ra các phần văn bản từ các tệp hoặc luồng, theo các tiêu chí mà bạn đặt ra. Cú pháp của nó cũng đơn giản như mục đích của nó, nhưng chính sự đơn giản chung này đã làm cho nó trở nên hữu ích.

Theo cách UNIX lâu đời, bằng cách kết hợp cutvới các tiện ích khác,grep bạn có thể tạo ra các giải pháp thanh lịch và mạnh mẽ cho các vấn đề khó khăn. Mặc dù có nhiều phiên bản khác nhau cut, nhưng chúng ta sẽ thảo luận về phiên bản GNU / Linux tiêu chuẩn. Lưu ý rằng các phiên bản khác, đặc biệt là phiên bản cutđược tìm thấy trong các biến thể BSD, không bao gồm tất cả các tùy chọn được mô tả ở đây.

Bạn có thể kiểm tra phiên bản nào được cài đặt trên máy tính của mình bằng cách ra lệnh sau:

Mã nguồn [Chọn]
cut --version
Nếu bạn thấy "GNU coreutils" trong đầu ra, bạn đang sử dụng phiên bản mà chúng tôi sẽ mô tả trong bài viết này. Tất cả các phiên bản của cutđều có một số chức năng này, nhưng phiên bản Linux đã có những cải tiến được thêm vào.

2. Các bước đầu tiên với cut

Cho dù chúng tôi đưa thông tin vào cuthoặc sử dụng cutđể đọc một tệp, các lệnh chúng tôi sử dụng đều giống nhau. Bất cứ điều gì bạn có thể làm đối với luồng đầu vào có cutthể được thực hiện trên một dòng văn bản từ tệp và  ngược lại. Chúng ta có thể cutyêu cầu làm việc với byte, ký tự hoặc các trường được phân cách.

Để chọn một byte duy nhất, chúng tôi sử dụng -btùy chọn (byte) và cho biết cutchúng tôi muốn byte hoặc các byte nào. Trong trường hợp này, nó là byte năm. Chúng tôi đang gửi chuỗi "vietnetwork" vào cutlệnh bằng một dấu ngoặc kép, "|", từ echo.

Mã nguồn [Chọn]
echo 'vietnetwork' | cut -b 5
Byte thứ năm trong chuỗi đó là "n ", vì vậy hãy cut trả lời bằng cách in "n" trong cửa sổ đầu cuối.

Để chỉ định một  phạm vi , chúng tôi sử dụng dấu gạch nối. Để trích xuất các byte từ 5 đến — và bao gồm — 11, chúng tôi sẽ đưa ra lệnh này:

Mã nguồn [Chọn]
echo 'vietnetwork' | cut -b 5-11
Bạn có thể cung cấp nhiều byte hoặc phạm vi đơn lẻ bằng cách phân tách chúng bằng dấu phẩy. Để trích xuất byte 5 và byte 11, hãy sử dụng lệnh sau:

Mã nguồn [Chọn]
echo 'vietnetwork' | cut -b 5,11
Để lấy chữ cái đầu tiên của mỗi từ, chúng ta có thể sử dụng lệnh này:

Mã nguồn [Chọn]
echo 'vietnetwork' | cut -b 1,5,8
Nếu bạn sử dụng dấu gạch ngang không có số đầu tiên cut, hãy trả về mọi thứ từ vị trí 1 trở lên số. Nếu bạn sử dụng dấu gạch nối mà không có số thứ haicut, hãy trả về mọi thứ từ số đầu tiên đến cuối luồng hoặc dòng.

Mã nguồn [Chọn]
echo 'vietnetwork' | cut -b -6
Mã nguồn [Chọn]
echo 'vietnetwork' | cut -b 8-
2. Sử dụng cut với các ký tự

Sử dụng cut với các ký tự cũng giống như sử dụng nó với byte. Trong cả hai trường hợp, phải đặc biệt cẩn thận với các ký tự phức tạp. Bằng cách sử dụng -ctùy chọn (ký tự), chúng tôi cutyêu cầu hoạt động theo ký tự, không phải byte.

Mã nguồn [Chọn]
echo 'vietnetwork' | cut -c 1,5,8
Mã nguồn [Chọn]
echo 'vietnetwork' | cut -c 8-11
Chúng hoạt động chính xác như bạn mong đợi. Nhưng hãy xem ví dụ này. Đó là một từ gồm sáu chữ cái, vì vậy yêu cầu cuttrả lại các ký tự từ một đến sáu sẽ trả lại toàn bộ từ. Nhưng nó không. Đó là một ký tự ngắn. Để xem toàn bộ từ, chúng ta phải yêu cầu các ký tự từ một đến bảy.

Mã nguồn [Chọn]
echo 'piñata' | cut -c 1-6
Mã nguồn [Chọn]
echo 'piñata' | cut -c 1-7
Vấn đề là ký tự "ñ" thực sự được tạo thành từ hai byte. Chúng ta có thể thấy điều này khá dễ dàng. Chúng tôi có một tệp văn bản ngắn chứa dòng văn bản này:

Mã nguồn [Chọn]
cat unicode.txt
Chúng tôi sẽ kiểm tra tệp đó bằng hexdumptiện ích. Sử dụng -Ctùy chọn (canonical) cung cấp cho chúng ta một bảng các chữ số thập lục phân với ASCII tương đương ở bên phải. Trong bảng ASCII, "ñ" không được hiển thị, thay vào đó, có các dấu chấm biểu thị hai ký tự không in được. Đây là những byte được đánh dấu trong bảng thập lục phân.

Mã nguồn [Chọn]
hexdump -C unicode.txt
Hai byte này được chương trình hiển thị sử dụng — trong trường hợp này là Bash shell — để xác định "ñ." Nhiều ký tự Unicode sử dụng ba byte trở lên để đại diện cho một ký tự.

Nếu chúng tôi yêu cầu ký tự 3 hoặc ký tự 4, chúng tôi sẽ hiển thị biểu tượng cho một ký tự không in được. Nếu chúng ta yêu cầu các byte 3 và 4, shell sẽ hiểu chúng là "ñ."

Mã nguồn [Chọn]
echo 'piñata' | cut -c 3
Mã nguồn [Chọn]
echo 'piñata' | cut -c 4
Mã nguồn [Chọn]
echo 'piñata' | cut -c 3-4
3. Sử dụng cut với dữ liệu phân tách

Chúng tôi có thể yêu cầu cuttách các dòng văn bản bằng cách sử dụng một dấu phân cách được chỉ định. Theo mặc định, cut sử dụng một ký tự tab nhưng có thể dễ dàng bảo nó sử dụng bất cứ thứ gì chúng ta muốn. Các trường trong tệp "/ etc / passwd" được phân tách bằng dấu hai chấm ":", vì vậy chúng tôi sẽ sử dụng nó làm dấu phân cách và trích xuất một số văn bản.

Các phần văn bản giữa các dấu phân cách được gọi là  trường và được tham chiếu giống như byte hoặc ký tự, nhưng chúng đứng trước -ftùy chọn (các trường). Bạn có thể để một khoảng trắng giữa chữ "f" và chữ số, hoặc không.

Lệnh đầu tiên sử dụng -dtùy chọn (dấu phân cách) để yêu cầu cut sử dụng ":" làm dấu phân cách. Nó sẽ kéo trường đầu tiên ra khỏi mỗi dòng trong tệp "/ etc / passwd". Đó sẽ là một danh sách dài nên chúng tôi đang sử dụng tùy headchọn -n(số) để chỉ hiển thị năm câu trả lời đầu tiên. Lệnh thứ hai thực hiện điều tương tự nhưng sử dụng tailđể hiển thị cho chúng ta năm phản hồi cuối cùng.

Mã nguồn [Chọn]
cut -d ':' -f1 / etc / passwd | head -n 5
Mã nguồn [Chọn]
cut -d ':' -f2 / etc / passwd | tail -n 5
Để trích xuất lựa chọn các trường, hãy liệt kê chúng dưới dạng danh sách được phân tách bằng dấu phẩy. Lệnh này sẽ trích xuất các trường từ một đến ba, năm và sáu.

Mã nguồn [Chọn]
cut -d ':' -f1-3,5,6 /etc/passwd | tail -n 5
Bằng cách đưa grepvào lệnh, chúng ta có thể tìm kiếm các dòng bao gồm "/ bin / bash". Có nghĩa là chúng tôi chỉ có thể liệt kê những mục nhập có Bash làm trình bao mặc định của chúng. Đó thường sẽ là tài khoản người dùng "bình thường". Chúng tôi sẽ yêu cầu các trường từ một đến sáu vì trường thứ bảy là trường shell mặc định và chúng tôi đã biết đó là gì — chúng tôi đang tìm kiếm nó.

Mã nguồn [Chọn]
grep "/bin/bash" /etc/passwd | cut -d ':' -f1-6
Một cách khác để bao gồm tất cả các trường ngoài một trường là sử dụng --complementtùy chọn. Điều này đảo ngược lựa chọn trường và hiển thị mọi thứ  chưa  được yêu cầu. Hãy lặp lại lệnh cuối cùng nhưng chỉ yêu cầu trường bảy. Sau đó, chúng tôi sẽ chạy lại lệnh đó với --complementtùy chọn.

Mã nguồn [Chọn]
grep "/bin/bash" /etc/passwd | cut -d ':' -f7
Mã nguồn [Chọn]
grep "/bin/bash" /etc/passwd | cut -d ':' -f7 --complement
Lệnh đầu tiên tìm thấy một danh sách các mục nhập, nhưng trường bảy cho chúng ta không có gì để phân biệt giữa chúng, vì vậy chúng tôi không biết các mục nhập đó đề cập đến ai. Trong lệnh thứ hai, bằng cách thêm --complement tùy chọn, chúng tôi nhận được mọi thứ ngoại trừ trường bảy.

4. Cắt pipe thành cut

Gắn vào tệp "/etc/passwd", hãy trích xuất trường năm. Đây là tên thực của người dùng sở hữu tài khoản người dùng.

Mã nguồn [Chọn]
grep "/bin/bash" /etc/passwd | cut -d ':' -f5
Trường thứ năm có các trường con được phân tách bằng dấu phẩy. Chúng hiếm khi được điền vào nên chúng hiển thị dưới dạng một dòng dấu phẩy.

Chúng ta có thể loại bỏ dấu phẩy bằng cách chuyển đầu ra của lệnh trước đó vào một lệnh gọi khác của cut. Trường hợp thứ hai của cut sử dụng dấu phẩy "," làm dấu phân cách. Tùy -schọn (chỉ phân cách) yêu cutcầu loại bỏ các kết quả hoàn toàn không có dấu phân cách.

Mã nguồn [Chọn]
grep "/bin/bash" /etc/passwd | cut -d ':' -s -f5 | cut -d ',' -s -f1
Bởi vì mục gốc không có trường con dấu phẩy trong trường thứ năm, nó bị loại bỏ và chúng tôi nhận được kết quả như sau — danh sách tên của những người dùng "thực" được định cấu hình trên máy tính này.

5. Dấu phân cách đầu ra

Chúng tôi có một tệp nhỏ với một số Giá trị được phân tách bằng dấu phẩy trong đó. Các trường trong dữ liệu giả này là:

  • ID: Một số ID cơ sở dữ liệu
  • First: Tên đầu tiên của chủ thể.
  • Last: Họ của chủ thể.
  • Email: Địa chỉ email của họ.
  • Địa chỉ IP: Địa chỉ IP của họ.
  • Nhãn hiệu: Nhãn hiệu của phương tiện cơ giới mà họ lái.
  • Model: Mô hình xe cơ giới mà họ lái.
  • Năm: Năm chiếc xe cơ giới của họ được chế tạo.

Mã nguồn [Chọn]
cat small.csv
Nếu chúng ta yêu cầu cut sử dụng dấu phẩy làm dấu phân cách, chúng ta có thể trích xuất các trường giống như chúng ta đã làm trước đây. Đôi khi bạn sẽ có yêu cầu trích xuất dữ liệu từ một tệp, nhưng bạn không muốn có dấu phân cách trường trong kết quả. Bằng cách sử dụng --output-delimiterchúng ta có thể nói cut ký tự nào — hoặc trên thực tế, chuỗi ký  tự — để sử dụng thay vì dấu phân cách thực tế.

Mã nguồn [Chọn]
cut -d ',' -f 2,3 small.csv
Mã nguồn [Chọn]
cut -d ',' -f 2,3 small.csv --output-delimiter = ''
Lệnh thứ hai yêu cut cầu thay thế dấu phẩy bằng dấu cách.

Chúng tôi có thể thực hiện điều này xa hơn và sử dụng tính năng này để chuyển đầu ra thành danh sách dọc. Lệnh này sử dụng một ký tự dòng mới làm dấu phân cách đầu ra. Lưu ý "$" mà chúng ta cần đưa vào để ký tự dòng mới hoạt động và không được hiểu là một chuỗi hai ký tự theo nghĩa đen.

Chúng tôi sẽ sử dụng grep để lọc ra mục nhập cho Morgana Renwick và yêu cầu cutin tất cả các trường từ trường hai đến cuối bản ghi và sử dụng một ký tự dòng mới làm dấu phân cách đầu ra.

Mã nguồn [Chọn]
grep 'renwick' small.csv | cut -d ',' -f2- --output-delimiter = $ ''
Chuyển đổi bản ghi thành danh sách bằng cách sử dụng ký tự dòng mới làm dấu phân cách đầu ra

6. Lệnh tuy cũ nhưng là vàng

Tại thời điểm viết bài, lệnh cut nhỏ đang đến gần sinh nhật lần thứ 40 của nó, và chúng tôi vẫn đang sử dụng nó và viết về nó cho đến ngày hôm nay. Tôi cho rằng việc cut giảm văn bản ngày nay cũng giống như cách đây 40 năm. Điều đó, dễ dàng hơn rất nhiều khi bạn có trong tay công cụ phù hợp.