Як ви коментуєте своє запитання, awk
це дійсно шлях. Використовувати cut
можна разом із tr -s
стисканням пробілів, як показує відповідь КЕВ .
Дозвольте, однак, проглянути всі можливі комбінації для майбутніх читачів. Пояснення є у розділі Тест.
тр | вирізати
tr -s ' ' < file | cut -d' ' -f4
awk
awk '{print $4}' file
баш
while read -r _ _ _ myfield _
do
echo "forth field: $myfield"
done < file
sed
sed -r 's/^([^ ]*[ ]*){3}([^ ]*).*/\2/' file
Тести
Враховуючи цей файл, давайте перевіримо команди:
$ cat a
this is line 1 more text
this is line 2 more text
this is line 3 more text
this is line 4 more text
тр | вирізати
$ cut -d' ' -f4 a
is
# it does not show what we want!
$ tr -s ' ' < a | cut -d' ' -f4
1
2 # this makes it!
3
4
$
awk
$ awk '{print $4}' a
1
2
3
4
баш
Це читає поля послідовно. Використовуючи, _
ми вказуємо, що це викидна змінна як "незмінна змінна" для ігнорування цих полів. Таким чином, ми зберігаємо $myfield
як 4-е поле у файлі, незалежно від пробілів між ними.
$ while read -r _ _ _ a _; do echo "4th field: $a"; done < a
4th field: 1
4th field: 2
4th field: 3
4th field: 4
sed
Це вловлює три групи пробілів і жодних пробілів ([^ ]*[ ]*){3}
. Потім він вловлює все, що надходить, поки не буде пробіл, як 4-е поле, з яким він остаточно роздруковується \1
.
$ sed -r 's/^([^ ]*[ ]*){3}([^ ]*).*/\2/' a
1
2
3
4