csiket715
csiket715

Reputation: 51

bash to extract second half of name

Ok so with the new High Sierra, I am trying to write a script to automatically delete there local snapshots that eat up HDD space. I know you can shrink using thinlocalsnapshots / 1000000000 4 but I feel like that is only a band-aid.

So what I am trying to do is extract the date 2018-02-##-###### from:

sudo tmutil listlocalsnapshots / 
com.apple.TimeMachine.2018-02-15-170531
com.apple.TimeMachine.2018-02-15-181655
com.apple.TimeMachine.2018-02-15-223352
com.apple.TimeMachine.2018-02-16-000403
com.apple.TimeMachine.2018-02-16-013400
com.apple.TimeMachine.2018-02-16-033621
com.apple.TimeMachine.2018-02-16-063811
com.apple.TimeMachine.2018-02-16-080812
com.apple.TimeMachine.2018-02-16-090939
com.apple.TimeMachine.2018-02-16-100459
com.apple.TimeMachine.2018-02-16-110325
com.apple.TimeMachine.2018-02-16-122954
com.apple.TimeMachine.2018-02-16-141223
com.apple.TimeMachine.2018-02-16-151309
com.apple.TimeMachine.2018-02-16-161040

I have tried variations of

 | awk '{print $ } (insert number after $)

along with

 | cut -d ' ' -f 10-.

Please if you know what I am missing here I would greatly appreciate it

edit: Here is the script that will get rid of those pesky Local snapshots.If anyone is interested, Thanks again:

#! /bin/bash

dates=`tmutil listlocalsnapshots /  | awk -F "." 'NR++1{print $4}'`

for dates in $dates
do
   tmutil deletelocalsnapshots $dates
done

Upvotes: 1

Views: 50

Answers (3)

Dario
Dario

Reputation: 2723

1- awk: you can either specify the field separator with the -F option, or print a substring

 awk -F. '{print $4}'
 awk '{print substr($0,23)}'

2- cut: equivalently.

 cut -d. -f4
 cut -c23- 

3- Pure bash (sloooooow!): same as above.

while IFS=. read s1 s2 s3 d; do echo "$d"; done
while read line; do echo "${line:23}"; done

In practice, with a small number of records as in your use case, speed is not an issue and even pure bash or regexps (as in other aswers) can be used. As the number of records grows, the higher speed of awk and cut becomes noticeable.

Upvotes: 1

Gilles Quénot
Gilles Quénot

Reputation: 185530

Using and a :

$ grep -oP '\d{4}-\d{2}-\d{2}-\d{6}$'
2018-02-15-170531
2018-02-15-181655
2018-02-15-223352
2018-02-16-000403
2018-02-16-013400
2018-02-16-033621
2018-02-16-063811
2018-02-16-080812
2018-02-16-090939
2018-02-16-100459
2018-02-16-110325
2018-02-16-122954
2018-02-16-141223
2018-02-16-151309
2018-02-16-161040

Upvotes: 0

Walter A
Walter A

Reputation: 20022

You were close:

somecommand | cut -d"." -f4-
# or
somecommand | awk -F"." '{print $4}'

You can also try sed, but cut is made for this.

Upvotes: 1

Related Questions